将SWIG包装器与其他库链接

时间:2013-08-20 16:39:58

标签: c++ python gcc swig

我有一个C ++函数,我想从Python调用。函数本身非常简单,但它涉及一个只能在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进行编译,但未告诉我错误是什么。详细的链接器输出有大量的行说“尝试打开[某些lib]失败”但是少数这些行说“成功”。难道只是那些说失败的人阻止了连接的发生吗?我正在尝试使用SWIG模块做什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

使用SWIG编译后,请在终端中尝试以下操作:

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

那么您将能够从python导入模块。