0

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_dirsinclude_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上尝试这个。有人知道我怎样才能让这个工作吗?

4

0 回答 0