从 Python 加载动态共享 C++ 库时出现问题
Problem in loading dynamic shared c++ library from Python
我构建了一个链接到 .so 的项目 SharedProj。它链接了另外 4 个项目,这些项目构建为静态库:libA.a、libB.a、libC.a、libD.a。这些项目在 SharedProj.so 中设置为参考,并与 -l 标志链接。
当我尝试使用 cdll.LoadLibrary 从 Python 加载 SharedProj.so 时,它失败了例外:"cannot find libA.so - no such file"。
是的,这是真的:没有 libA.so,也不应该有。有 libA.a,它是静态链接的。
这里有什么问题?如何正确构建 SharedProj.so,以便 Python 正确加载它?
我试过将 SharedProj.so 与 -shared 或 -shared-libgcc 标志链接起来。
尝试使用 -static 或 -static-libgcc 标志构建静态库。
试图添加或删除 -fPIC 标志。
我已经在 Eclipse 中解决了这个问题 IDE。
显然,问题是我的静态 libs libA.a、libB.a、libC.a 使用了另一个库,比如 math lib,我还没有指定 linker 它必须在哪里搜索它们。
在最后的 link 指令中,我用 -L 标志传递了我的静态库的文件夹和 /lib 文件夹。我使用 -l 标志指定静态库的名称:libA、libB、libC。还包括以下标志:-shared -shared-gcclib -m64
此外,必须包含 linker 将所有符号拉入 .so 的指令:-Wl,--whole-archive all_the_static_libs.a -Wl,--no-whole-archive.所以,最后,link年龄线看起来像这样:
g++ -L"%workspace/libA/Debug" -L"%workspace/libB/Debug" -L"%workspace/libC/Debug" -L/lib -Wl,--whole-archive -llibA -llibB -llibC -Wl,--no-whole-archive -m64 -shared-libgcc -shared -o "SharedProj.so" ./SharedProj.o
我构建了一个链接到 .so 的项目 SharedProj。它链接了另外 4 个项目,这些项目构建为静态库:libA.a、libB.a、libC.a、libD.a。这些项目在 SharedProj.so 中设置为参考,并与 -l 标志链接。
当我尝试使用 cdll.LoadLibrary 从 Python 加载 SharedProj.so 时,它失败了例外:"cannot find libA.so - no such file"。 是的,这是真的:没有 libA.so,也不应该有。有 libA.a,它是静态链接的。
这里有什么问题?如何正确构建 SharedProj.so,以便 Python 正确加载它?
我试过将 SharedProj.so 与 -shared 或 -shared-libgcc 标志链接起来。 尝试使用 -static 或 -static-libgcc 标志构建静态库。 试图添加或删除 -fPIC 标志。
我已经在 Eclipse 中解决了这个问题 IDE。 显然,问题是我的静态 libs libA.a、libB.a、libC.a 使用了另一个库,比如 math lib,我还没有指定 linker 它必须在哪里搜索它们。 在最后的 link 指令中,我用 -L 标志传递了我的静态库的文件夹和 /lib 文件夹。我使用 -l 标志指定静态库的名称:libA、libB、libC。还包括以下标志:-shared -shared-gcclib -m64 此外,必须包含 linker 将所有符号拉入 .so 的指令:-Wl,--whole-archive all_the_static_libs.a -Wl,--no-whole-archive.所以,最后,link年龄线看起来像这样:
g++ -L"%workspace/libA/Debug" -L"%workspace/libB/Debug" -L"%workspace/libC/Debug" -L/lib -Wl,--whole-archive -llibA -llibB -llibC -Wl,--no-whole-archive -m64 -shared-libgcc -shared -o "SharedProj.so" ./SharedProj.o