1

我有一个要从 Python 调用的 C++ 函数。该函数本身非常简单,但它涉及只能在 C++ 中完成的 IPC 调用。要编译该 C++ 代码需要链接大量其他库。我正在尝试为此使用 SWIG。我有一个看起来像这样的 Makefile:

all: swig object shared

object: swig
  ${CC} -c ${MODULE}_wrap.cxx ${INCLUDES}

shared:
  ${CC} -Wl,--verbose -shared ${MODULE}_wrap.o -o _${MODULE}.so

swig:
  ${SWIG} -c++ -python ${MODULE}.i

有了这个,一切都编译得很好,但是在 Python 中导入我的模块会给我“未定义的符号”错误。如果我将shared行更改为:

shared:
  ${CC} -Wl,--verbose -shared ${MODULE}_wrap.o -o _${MODULE}.so ${LIBS}

它无法编译,collect2: ld returned 1 exit status但没有准确地告诉我错误是什么。详细的链接器输出有很多行说“尝试打开 [某些库] 失败”,但其中一些行说“成功”。难道只是那些说失败的人阻止了链接的发生吗?使用 SWIG 模块,我正在尝试做的事情是否可行?

4

2 回答 2

1

对的,这是可能的。您需要确保在 Python 加载模块时解析您包装的 C/C++ 模块所依赖的共享库。检查库(生成的 Swig)ldd以查看它依赖的库。链接模块时,最好设置 rpath(运行时路径;类似于:-rpath=/path/to/your/libsgcc)以指向这些库的位置。或者,您可以LD_LIBRARY_PATH在运行 Python 之前进行适当的设置。

于 2013-08-20T16:46:47.740 回答
0

使用 SWIG 编译后,在终端中尝试:

$ export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/where/library/is_located/lib
$ python

然后你就可以从 python 导入你的模块了。

于 2019-07-08T16:02:21.177 回答