导入我使用Cython创建的模块时,我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(./something.so, 2): Symbol not found: _something
Referenced from: ./something.so
Expected in: flat namespace
in ./something.so
我的C代码是:
#include <stdio.h>
void print_something(void)
{
printf("Hello iris\n");
}
int return_something(int x)
{
return x*x;
}
我的.pyx文件是:
cimport numpy as np
cimport cython
cdef extern from "my_header.h":
void something()
ctypedef unsigned int x
int return_something(int x)
def my_func():
something()
def x2(x):
cdef int X = x
return return_something(X)
cimport
,ctypedef unsigned int x
和cdef int X = x
是我尝试使用此功能的尝试,我不确定是否需要它们。我试过没有这些补充也无济于事。
最后,我的setup.py看起来像这样:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import os
import numpy
# important to include "my_function.c" in the sources list
ext_modules=[Extension("something",
sources=["something.pyx", "my_function.c" ],
include_dirs=[numpy.get_include()])]
setup(name="something",
ext_modules = cythonize(ext_modules))
我可以编译C代码并运行它,所以我猜测.pyx有问题。
答案 0 :(得分:0)
只是一个补充:上面的评论帮助我弄清了我为几天苦苦挣扎的实际错误。在OP的情况下,他从C(C ++)用Python导入的术语在他的C / C ++程序中未定义。就我而言,我有一些错误的类型定义,例如
std::vector<int> generate_2CNF(
std::vector<uint64_t> &
);
在我的.h
文件和
std::vector<int> generate_2CNF(
std::vector<long> &
){ ... }
在我的.cpp
实现文件中。奇怪的是,对我来说,我似乎只编译了cpp
部分而没有Python
,但是没有得到任何错误。
由于代码中的这种不一致,我遇到了与OP相同的错误。直到最后一刻,我相信这不是代码中的错误,而是链接程序中的错误。事实证明,这类错误不容易发现,因为编译器无法帮助您指出确切的不一致之处。如果您使用Cython
,只需仔细检查一下.cpp
/ .c
代码中是否没有实际错误,否则以后将很难调试它。