Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 级联库依赖项_Python_C_Cuda_Shared Libraries_Undefined Symbol - Fatal编程技术网

Python 级联库依赖项

Python 级联库依赖项,python,c,cuda,shared-libraries,undefined-symbol,Python,C,Cuda,Shared Libraries,Undefined Symbol,由于太长的原因,我需要在“C”中创建一个可在Python中调用的共享库(称为libA)。此共享库需要调用另一个自定义共享库(我们将其命名为libCuda)。此外,libA调用许多其他外部共享库,如MySQL等 在包含libCuda之前,Python中调用的所有C函数都工作正常,MySQL子调用工作正常,等等。但是,一旦libCuda添加到libA中,Python抱怨: caughtError c process - [directory]/libA.so: undefined symbol: c

由于太长的原因,我需要在“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链接(即在函数协议中导出“C”)。我已经使用独立测试台(用C编写)测试了这个共享库(libCuda),一切正常。这是用于编译Cuda库的指令:

nvcc -arch=sm_30 -shared -o libCuda.so *.cu -Xcompiler -fPIC
如果我使用:

$ ldd libA
我没有看到任何信息表明libA需要加载libCuda(或MySQL)

用于编译libA的命令如下(libCuda位于本地目录中):


我已尝试将这两个库文件放置在/usr/lib中,并显式导出LD_library_路径。不走运。任何帮助都将不胜感激

链接libA.so时,应将使用的共享库指定为依赖项(
-L$somedirectory-lCuda
)。然后,依赖项将通过
ldd./libA可见。因此,正如它们应该看到的那样,
LD\u LIBRARY\u PATH
将有所帮助

共享库中允许使用未定义的符号,因此在构建库时,您需要提供足够的依赖项。如果同样的事情没有发生在
libmysqlclient
上,那可能是因为
libmysqlclient
是由于其他依赖项(或者是在
RTLD\u GLOBAL
libA.so
之前动态加载的)。那么它可能不是你想要的,即使问题不是立即可见的

附言

  • 您可能需要阅读sonames上的一些内容(从
    manld
    ?)来决定是否真的要链接到
    libCuda.so
    (而不是像我所希望的那样链接到
    libCuda.so.N
  • 要快速而肮脏的解决方法(如果你还在这里:),请尝试
    LD_PRELOAD=/full/path/to/libCuda.so您的程序

  • 好吧,所以我没赢,但我改变了规则

    ,我首先用nvcc编译CUDA代码,从而创建了几个对象(*.o)文件。在创建libA库时,这些对象文件被添加到gcc链接的对象文件列表中。此外,以下链接器参数被添加到gcc命令“-L/usr/local/cuda/lib64-lcudart”(我使用的是x64机器)

    必须指出,必须将任何库依赖项放在需要它的对象文件之后,这一点非常重要。如果不这样做,gcc将抱怨未定义的引用。一个好的经验法则是将所有库放在gcc行的末尾。详情见下文

    简而言之,以下是有效的方法:

    CUDA:

    C:


    非常感谢安东·科瓦连科的建议。不幸的是,我没能解决我的最终目标,但也许这会成为其他人的中间人,就像现在对我一样。

    用户库真的被称为
    libCUDA。所以
    ?不,我意识到nVidia提供了一个同名的库。这是试图在我的问题中隐藏不必要的复杂性。太好了,谢谢你的回答!我正在按照你的描述编译libA。这使得ldd没有列出依赖项这一事实更加奇怪。我将编辑我的原始帖子以包含libA编译器命令。此外,我还调查了sonames,并尝试了您建议的命名约定。运气不好:\n您是否尝试过LD_PRELOAD
    ,是否有帮助?还有,-soname=。。。。是在构建
    libCuda
    时使用的,因此
    ld
    将为
    -lCuda
    插入对它的引用。还没有,我将尝试一下。不幸的是,nvcc不喜欢“-soname”指令,即使它在“-Xcompiler”后面。再次感谢!
    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
    
    nvcc -arch=sm_30 -c *.cu -Xcompiler -fPIC
    
    gcc *.c -c -fPIC -L/usr/local/cuda/lib64 -lcudart -lmysqlclient [many other shared libraries]
    gcc -shared -Wl,-soname,libA.so -o libA.so *.o [cuda_obj_file_dir]/*.o -L/usr/local/cuda/lib64 -lcudart -lmysqlclient [many other shared libraries]