Компиляция оболочки для библиотеки c с использованием Cython - Linker не может найти .dylib внешней библиотеки c в OSX - PullRequest
0 голосов
/ 01 мая 2020

Я написал оболочку на Cython для функции интеграции из библиотеки NAG (https://www.nag.co.uk/content/nag-library-c) c. Он компилируется с использованием python setup.py build --inplace, где установочный файл:

from setuptools import Extension, setup
from Cython.Build import cythonize
import re

def loadMacros(headerFile):
    """ Given a .h file, return dict of touples with macros """
    regex = re.compile("#define +(\w+) *(\w*)")
    with open(headerFile) as f:
        macros = dict(map(lambda x: re.match(regex, x).groups(),
                          [l for l in f if re.match(regex, l)]))
    # Remove recursive entries - Note this is not foolproof..
    # while not set(macros.keys()).isdisjoint(macros.values()):
    #     for k, v in macros.items():
    #         if v in macros:
    #             macros[k] = macros[v]
    return macros


nagHome = "/Users/hfmw1m17/NAG/nlmi627dbl"  # "/opt/NAG/cll6a23dhl"
macros = loadMacros(nagHome + "/lp64/include/nag.h")
macros = list(macros.items())

e = Extension("nag_integrate",
              define_macros=macros,
              sources=["nag_integrate.pyx"],
              include_dirs=[nagHome + "/lp64/include",nagHome + "/lp64/lib"],
              library_dirs=[nagHome + "/lp64/lib"],libraries=["nag_nag"],extra_objects=[
        nagHome+"/lp64/lib/libnag_nag.dylib"],runtime_library_dirs=[nagHome+"/lp64/lib/"],extra_link_args=['-Wl,-rpath']
)


setup(ext_modules=cythonize(e,annotate=True,language_level=3))enter code here

с выводом:

/Users/hfmw1m17/anaconda3/envs/TowingTankAcoustics/bin/python3.7 setup.py build_ext --inplace
Compiling nag_integrate.pyx because it changed.
[1/1] Cythonizing nag_integrate.pyx
running build_ext
building 'nag_integrate' extension
gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/hfmw1m17/anaconda3/envs/TowingTankAcoustics/include -arch x86_64 -I/Users/hfmw1m17/anaconda3/envs/TowingTankAcoustics/include -arch x86_64 -DNAG_H= -DNAG_MICROSOFT_THREAD_SAFE= -DNAG_THREAD_SAFE= -DNULLFN=0 -DNULLDFN=0 -DNAGERR_DEFAULT= -DNAGUSER_DEFAULT= -DNAGCOMM_NULL= -DNAGMESG_DEFAULT= -DE01_DEFAULT= -DE04_DEFAULT= -DG13_DEFAULT= -DH02_DEFAULT= -DINIT_FAIL= -DSET_FAIL= -DINIT_MESG= -DINIT_STREAM= -DRDUMMY= -DIDUMMY= -DINIT2DUMMY= -DVprintf= -DVfprintf= -DVsprintf= -DVscanf= -DVfscanf= -DVstrcpy= -DABS= -DFABS= -DSIGN= -DMAX= -DMIN= -DDROUND= -DROUND= -DSQZABS= -DCONJ= -DVCONJ= -DZMULT= -D_nag_expand= -Dnag_stringize= -I/Users/hfmw1m17/NAG/nlmi627dbl/lp64/include -I/Users/hfmw1m17/NAG/nlmi627dbl/lp64/lib -I/Users/hfmw1m17/anaconda3/envs/TowingTankAcoustics/include/python3.7m -c nag_integrate.c -o build/temp.macosx-10.9-x86_64-3.7/nag_integrate.o
gcc -bundle -undefined dynamic_lookup -L/Users/hfmw1m17/anaconda3/envs/TowingTankAcoustics/lib -arch x86_64 -L/Users/hfmw1m17/anaconda3/envs/TowingTankAcoustics/lib -arch x86_64 -arch x86_64 build/temp.macosx-10.9-x86_64-3.7/nag_integrate.o /Users/hfmw1m17/NAG/nlmi627dbl/lp64/lib/libnag_nag.dylib -L/Users/hfmw1m17/NAG/nlmi627dbl/lp64/lib -L/Users/hfmw1m17/NAG/nlmi627dbl/lp64/lib/ -lnag_nag -o build/lib.macosx-10.9-x86_64-3.7/nag_integrate.cpython-37m-darwin.so -Wl,-rpath
copying build/lib.macosx-10.9-x86_64-3.7/nag_integrate.cpython-37m-darwin.so -> 

Process finished with exit code 0

Однако, когда я импортирую функцию из. поэтому объект создан, я получаю следующую ошибку:

ImportError: dlopen(/Users/hfmw1m17/WaterTankISM/WaterTankISM/nag_integration/nag_integrate.cpython-37m-darwin.so, 2): Library not loaded: libnag_nag.dylib
  Referenced from: /Users/hfmw1m17/WaterTankISM/WaterTankISM/nag_integration/nag_integrate.cpython-37m-darwin.so
  Reason: image not found

libnag_nag.dylib - это динамическая c библиотека, созданная NAG.

Использование otool -L для общего объекта моей оболочки приводит к:

libnag_nag.dylib (compatibility version 0.0.0, current version 27.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)

Я думаю, что проблема с компоновщиком, который не может найти библиотеку динамического c при компиляции , Любые предложения о том, как решить эту проблему?

большое спасибо

1 Ответ

0 голосов
/ 04 мая 2020

Решено с помощью:

install_name_tool -add_rpath path_to_dylib_directory

после запуска python setup.py build --inplace.

Хотелось бы, чтобы это было сделано в файле setup.py, если кто-нибудь может это понять.

большое спасибо

...