我正在构建一个使用“第三方”库的 C Python 扩展——在本例中,我使用单独的构建过程和工具链构建了一个。调用这个库libplumbus.dylib。
目录结构为:
grumbo/
include/
plumbus.h
lib/
libplumbus.so
grumbo.c
setup.py
Run Code Online (Sandbox Code Playgroud)
我的setup.py样子大约是:
from setuptools import Extension, setup
native_module = Extension(
'grumbo',
define_macros = [('MAJOR_VERSION', '1'),
('MINOR_VERSION', '0')],
sources = ['grumbo.c'],
include_dirs = ['include'],
libraries = ['plumbus'],
library_dirs = ['lib'])
setup(
name = 'grumbo',
version = '1.0',
ext_modules = [native_module] )
Run Code Online (Sandbox Code Playgroud)
由于 libplumbus 是一个外部库,当我运行时,import grumbo我得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dlopen(/path/to/grumbo/grumbo.cpython-37m-darwin.so, 2): Library not loaded: lib/libplumbus.dylib
Referenced …Run Code Online (Sandbox Code Playgroud) 我试图将C代码公开给cython,并尝试使用另一个cython模块中的c文件中定义的函数时遇到“未定义符号”错误。
我的h文件中定义的函数以及使用手动包装的函数都可以正常工作。
基本上与这个问题相同,但是解决方案(针对库的链接)对我来说并不令人满意。
我认为我在setup.py脚本中缺少什么?
foo.h
int source_func(void);
inline int header_func(void){
return 1;
}
Run Code Online (Sandbox Code Playgroud)
foo.c
#include "foo.h"
int source_func(void){
return 2;
}
Run Code Online (Sandbox Code Playgroud)
cdef extern from "foo.h":
int source_func()
int header_func()
cdef source_func_wrapper()
Run Code Online (Sandbox Code Playgroud)
foo_wrapper.pyx
cdef source_func_wrapper():
return source_func()
Run Code Online (Sandbox Code Playgroud)
cimport foo_wrapper
def do_it():
print "header func"
print foo_wrapper.header_func() # ok
print "source func wrapped"
print foo_wrapper.source_func_wrapper() # ok
print "source func"
print foo_wrapper.source_func() # undefined symbol: source_func
Run Code Online (Sandbox Code Playgroud)
foo_wrapper和test_lib
cdef extern from …Run Code Online (Sandbox Code Playgroud)