SWIG与C++的封装问题 --> Python

3

我想使用SWIG封装一个依赖于另一个C++文件(global.cpp)的C++文件,我已经成功地处理了第一个文件,但是这个嵌套依赖似乎会导致问题。以下是我的设置:

position.i

%module position
%include global.i
%{
  #include "pos.h"
%}
%include "pos.h"
%include "global.h"
... (functions declared)

position.cpp

#include <algorithm> 
#include "global.h"
#include "pos.h"
...(functions implemented)

position.h

原型

然后我这样做。

swig -c++ -python -builtin position.i
g++ -O2 -fPIC -c position.cpp
g++ -O2 -fPIC -c -I/Users/aaron/anaconda/include/python3.5m position_wrap.cxx

我有两个目标文件,然后我将它们绑定在一起。
g++ -dynamiclib -lpython position.o global.o position_wrap.o -o _position.so

我在 Stack Overflow 上查看了许多方法,试图解决这个问题,但是都没有成功。现在我一直受阻。
出现了一个错误。
 ...
 "_PyUnicode_FromFormat", referenced from:
      SwigPyObject_repr(SwigPyObject*) in position_wrap.o
      SwigPyPacked_repr(SwigPyPacked*) in position_wrap.o
      SwigPyPacked_str(SwigPyPacked*) in position_wrap.o
  "_PyUnicode_FromString", referenced from:
      _PyInit__position in position_wrap.o
      SWIG_Python_DestroyModule(_object*) in position_wrap.o
      SwigPyPacked_str(SwigPyPacked*) in position_wrap.o
  "_Py_DecRef", referenced from:
      SwigPyObject_repr(SwigPyObject*) in position_wrap.o
  "__PyObject_New", referenced from:
      _PyInit__position in position_wrap.o
...
    ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

使用编译方式。我尝试了不同的链接器标志,通过进入路径python3-config --ldflags。我添加了-std=libstdc++标志。我曾经想方设法让模块生成,但在导入Python时却面临着:
ImportError:   dlopen(/Users/aaron/Desktop/swigdPython/src/_position.cpython-35m-darwin.so, 2):
    Symbol not found: __Z10e_to_ed Referenced from:
        /Users/aaron/Desktop/swigdPython/src/_position.cpython-35m-darwin.so
    Expected in: dynamic lookup"

我正在努力想出正确的方法来链接这些文件,希望这里有人能给予指导。

3个回答

2

在链接命令行中,应将库指定在最后:

g++ -dynamiclib position.o global.o position_wrap.o -o _position.so -lpython

这样做的结果是错误信息更小,但仍然收到未定义符号的错误。 - Anisotropic
@Anisotropic:您可能需要链接其他库。哪些符号仍未定义? - chqrlie
1
编译器在包装对象中引用了未定义的 "_PyInstanceMethod_New"、"_PyModule_Create2"、"_PyUnicode_Concat"、"_PyUnicode_FromFormat"、"_PyUnicode_FromString",导致出错。调用方式为 Thread model: posix "/Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.10.xctoolchain/usr/bin/ld" -demangle -dynamic -dylib -arch x86_64 -macosx_version_min 10.10.0 -o _sunposition.so sunpos.o global.o sunpos_wrap.o -lpython -lc++ -lSystem /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/lib/darwin/libclang_rt.osx.a - Anisotropic
你在/usr/lib目录中看到了libpython.dylib吗? - chqrlie
是的,还有它的2.7版本。 - Anisotropic

2
这里的顺序可能很重要,即:
g++ -dynamiclib position.o global.o position_wrap.o -lpython -o _position.so

替代

g++ -dynamiclib -lpython position.o global.o position_wrap.o -o _position.so

1
我用这个命令最终使它工作了:

g++ -dynamiclib -o _position.so position_wrap.o position.o global.o -
I/Users/aaron/anaconda/include/python3.5m/ - L/Users/aaron/anaconda/lib/ -I/Users/aaron/Desktop/swigdPython/src -lpython3.5

然后我无法加载模块,直到导出一个环境变量:

export DYLD_LIBRARY_PATH=/Users/aaron/anaconda/lib:$DYLD_LIBRARY_PATH


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接