使用C ++进行SWIG包装问题 - >蟒蛇

时间:2016-01-15 02:20:39

标签: python c++ swig

我正在尝试使用SWIG包装依赖于另一个C ++文件(global.cpp)的C ++文件。我能够让第一个工作正常,但这种嵌套依赖似乎会导致问题。这是我的设置:

position.i

def dot_draw(x_positions, y_positions, RGBs):
    for dot in range(0, len(x_positions)):
        pygame.draw.circle( screen, RGBs[dot], [ x_positions[dot], y_positions[dot] ], 10) 
    pygame.display.update()

position.cpp

<?php echo "var place =".$city.";"; ?>

position.h

原型

然后我这样做。

<?php echo "var place = '$city';"; ?>

我有两个目标文件,然后用

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

在仔细阅读之后,我尝试了很多不同的方法,但我完全被扼杀了。

我收到错误

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

编译。我通过转到路径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 标志。我曾经以某种方式获得了生成模块,但是在导入python时遇到了:

 ...
 "_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)

我不知道试图找出链接这些文件的正确方法,并希望有人在这里有一些见解。

3 个答案:

答案 0 :(得分:2)

您应该在链接命令行上最后指定库:

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

答案 1 :(得分: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

答案 2 :(得分: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

相关问题