由于这里解释得太长,我需要在“C”中创建一个可在Python中调用的共享库(称为libA)这个共享库需要调用另一个自定义共享库(我们将其命名为libCuda)。此外,libA还调用许多其他外部共享库,如MySQL等。
在包含libCuda之前,Python中调用的所有C函数工作正常,MySQL子调用工作正常,等等。但是,一旦libCuda被添加到libA中,Python就会抱怨:
caughtError c process - [directory]/libA.so: undefined symbol: cudaFunction1
libCuda,正如您可能已经猜到的,是用nvcc编译的nVidia Cuda代码,并且设置为C-linkable(即在函数协议中导出“C”),我已经用一个独立的测试平台(用C编写)测试了这个共享库(libCuda),一切都按预期工作这是用于编译Cuda库的指令:
nvcc -arch=sm_30 -shared -o libCuda.so *.cu -Xcompiler -fPIC
如果我使用:
$ ldd libA
我没有看到任何信息表明libA需要加载libCuda(或者MySQL)
用于编译libA的命令如下(libCuda位于本地目录中):
gcc *.c -c -L. -lCuda -lmysqlclient [many other shared libraries] -fPIC
gcc -shared -Wl,-soname,libA.so -lCuda -lmysqlclient [many other shared libraries] -o libA.so *.o
我尝试将两个库文件都放在/usr/lib中,并显式导出LD_library_路径运气不好。任何帮助都将不胜感激!
最佳答案
链接libA.so时,应将使用的共享库指定为依赖项(-L$somedirectory -lCuda
)然后,依赖项会在ldd ./libA.so
中显示出来,正如它们应该显示的那样,然后LD_LIBRARY_PATH
会有帮助。
在共享库中允许使用未定义的符号,因此在构建一个符号库时,您需要提供足够的依赖项。如果libmysqlclient
没有发生同样的事情,那可能是因为libmysqlclient
是由于某些其他依赖关系而加载的(或者是在RTLD_GLOBAL
和libA.so
之前动态加载的)那么它可能不是你想要的,即使问题不是立即可见的。
附笔。
你可能想读一些关于奏鸣曲的东西(从man ld
?)决定你是否真的想要链接到libCuda.so
(而不是像我所希望的那样链接到libCuda.so.N
)。
为了快速而肮脏的解决方法(如果你还在这里和我在一起:),请尝试LD_PRELOAD=/full/path/to/libCuda.so your-program
。
关于python - 级联库依赖关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14246117/