用C++ ++ python进行包装问题

2024-09-23 22:31:12 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我试图包装一个依赖于另一个C++文件的C++文件(全局.cpp)通过使用SWIG。我能够让第一个很好地工作,但是这种嵌套的依赖似乎引起了一个问题。以下是我的设置:

位置。我

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

在位置.cpp在

^{pr2}$

位置。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

我试过很多不同的方法来做这件事,在仔细研读后,我已经完全窒息了。在

我有个错误

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

我不知道该如何链接这些文件,希望这里有人能有所了解。在


Tags: 文件infromsoincludepositionglobalusers
3条回答

我终于用这个命令实现了:

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

您应该在link命令行最后指定库:

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

顺序可能很重要,即

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

而不是

^{pr2}$

相关问题 更多 >