【问题标题】:Linking a SWIG wrapper with other libraries将 SWIG 包装器与其他库链接
【发布时间】:2013-08-20 16:39:57
【问题描述】:

我有一个要从 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 模块做的事情是否可行?

【问题讨论】:

    标签: c++ python gcc swig


    【解决方案1】:

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

    【讨论】:

    • 我不能对 SWIG 生成的库执行 ldd,因为它只是一个目标文件。但无论如何我都试过了。 -rpath= 不起作用,但我尝试了-Xlinker -rpath -Xlinker [path]。我也试过LD_LIBRARY_PATH。我仍然得到未定义的符号错误。我觉得我错过了一些明显的东西。
    【解决方案2】:

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

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

    那么你就可以从 python 导入你的模块了。

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2014-01-06
      • 2018-08-23
      • 2014-03-19
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多