0

I have a compiled C library htslib in my module top-level directory, this is first built using ./configure; make outside of python before running python setup.py install. I am trying to use headers listed in htslib. I have cython scripts e.g. script.pyx which wrap supporting header files cpp_header.h, but these are compiled using C++ via the setup script. Setup of the python module runs without problems, but at runtime htslib symbols are missing, I get ImportError: foo.cpython-37m-x86_64-linux-gnu.so: undefined symbol: hts_close. My directory structure is:

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

In my setup script I list some libraries needed for htslib, some library_dirs, include_dirs, and extra_compile_args for building the 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++"))

Additionally, I also add htslib to the package_data option in setup:

setup(...
      packages=["foo"],
      package_data={"foo": ["htslib/*"]},
      ext_modules=cythonize(ext_modules),
      ...
)

Inside the cpp_header.h file the htslib headers are included as:

#include "../htslib/htslib/sam.h"

Im trying this on unix. Would any one know how I can get this working?

kezzos
  • 3,023
  • 3
  • 20
  • 37
  • Do I miss it, or is `htslib` not in your `libraries`? If not, how is it supposed to be used by the linker? – ead May 11 '20 at 15:15
  • hmm. I just tried adding the absolute path to the hstlib folder, into the libraries, but still got the same error – kezzos May 11 '20 at 15:21

0 Answers0