htslib
我的模块顶级目录中有一个已编译的 C 库,这是./configure; make
在运行之前首先使用 python 外部构建的python setup.py install
。我正在尝试使用htslib
. 我有 cython 脚本,例如script.pyx
它包装了支持的头文件cpp_header.h
,但这些是通过安装脚本使用 C++ 编译的。python 模块的设置运行没有问题,但在运行时htslib
符号丢失,我得到ImportError: foo.cpython-37m-x86_64-linux-gnu.so: undefined symbol: hts_close
. 我的目录结构是:
foo/
htslib/ # c library
objectfiles.o
htslib/
headers.h
cram/
more_headers.h
more_objects.o
foo/
script.pyx
cpp_header.h # c++
setup.py
在我的设置脚本中,我列出了一些需要的库htslib
,一些库library_dirs
,include_dirs
以及extra_compile_args
构建Extension
:
root = os.path.abspath(os.path.dirname(__file__))
htslib = os.path.join(root, "htslib")
libraries = [htslib]
library_dirs = [htslib, numpy.get_include(), root, "htslib", "foo"]
include_dirs = [numpy.get_include(), root, htslib]
for item in ["htslib", "cram"]:
include_dirs.append(os.path.join(htslib, item))
ext_modules.append(Extension(f"foo.script",
[f"foo/script.pyx"],
libraries=libraries,
library_dirs=library_dirs,
include_dirs=include_dirs,
extra_compile_args=extras,
define_macros=[("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION")],
language="c++"))
此外,我还添加htslib
了以下package_data
选项setup
:
setup(...
packages=["foo"],
package_data={"foo": ["htslib/*"]},
ext_modules=cythonize(ext_modules),
...
)
在cpp_header.h
文件中,htslib 标头包含为:
#include "../htslib/htslib/sam.h"
我在unix上尝试这个。有人知道我怎样才能让这个工作吗?