使用python扩展时链接到其他库(例如boost) 我使用Python调用C++代码,使用下面的StupU.py-file。(使用swig生成包装后)

使用python扩展时链接到其他库(例如boost) 我使用Python调用C++代码,使用下面的StupU.py-file。(使用swig生成包装后),python,c++,linker,swig,Python,C++,Linker,Swig,然而,当我尝试包括其他库时,在本例中是boost,我得到以下错误 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/pathToExample/example.py", line 28, in <module> _example = swig_import_helper() File "/pathToExample/example.py", l

然而,当我尝试包括其他库时,在本例中是boost,我得到以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/pathToExample/example.py", line 28, in <module>
_example = swig_import_helper()
  File "/pathToExample/example.py", line 24, in swig_import_helper
_mod = imp.load_module('_example', fp, pathname, description)
  File "/some_path/lib/python3.4/imp.py", line 243, in load_module
    return load_dynamic(name, filename, file)
ImportError: dlopen(/pathToExample/_example.so, 2): Symbol not found: __ZN5boost4math12sph_hankel_1IiiEESt7complexINS0_6detail13bessel_traitsIT_T0_NS0_8policies6policyINS7_14default_policyES9_S9_S9_S9_S9_S9_S9_S9_S9_S9_S9_S9_EEE11result_typeEES5_S6_
  Referenced from: /pathToExample/_example.so
  Expected in: dynamic lookup
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/pathToExample/example.py”,第28行,在
_示例=swig\u import\u helper()
swig\u import\u helper中的文件“/pathToExample/example.py”,第24行
_mod=imp.load_模块(“示例”,fp,路径名,描述)
文件“/some_path/lib/python3.4/imp.py”,第243行,在加载模块中
返回加载动态(名称、文件名、文件)
ImportError:dlopen(/pathToExample/\u example.so,2):未找到符号:\uzn5boost4math12sph\uHankel\u1查看复杂度\u6详细信息\u8 bessel\u8跟踪策略默认策略中的策略_
引用自:/pathToExample/\u example.so
应为:动态查找
这可能是一个链接问题吗?如何更改setup.py

Edit1:将-lboost\u系统添加到额外的编译参数

EdT2:这是我的C++代码:

#include <vector>
#include <complex>
#include </usr/local/include/boost/math/special_functions/bessel.hpp>

using namespace std;

vector<float> Test(int n){
    vector<float> a(2);
    complex<double> b = boost::math::sph_hankel_1(0, 1);
    a[1] = real(b);
    return a;    
}
#包括
#包括
#包括
使用名称空间std;
向量测试(int n){
载体a(2);
复数b=boost::math::sph_hankel_1(0,1);
a[1]=实(b);
返回a;
}
编辑3: 这里是我用来生成包装器的swig代码

/* File: example.i */
%module example
%include "std_vector.i"

%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

namespace std
{
  %template(FloatVector) vector<float>;
}

std::vector< float > Test(int n);
/*文件:example.i*/
%模块示例
%包括“标准向量i”
%{
#使用_INIT定义SWIG_文件
#包括“example.h”
%}
名称空间标准
{
%模板(浮动向量)向量;
}
标准:向量测试(int n);
编辑4:为完整起见,请参见我的头文件:

/* File: example.h*/

#include <vector>
#include <complex>
#include </usr/local/include/boost/math/special_functions/bessel.hpp>

std::vector<float> Test(int n);
/*文件:example.h*/
#包括
#包括
#包括
标准::向量测试(int n);

是的,这是一个链接问题,如错误所示:

Symbol not found: __ZN5boost4math12sph_hankel_ ...
你错过了数学课


您需要更改
setup.py
文件,方法是将
-lboost\u math
添加到选项
extra\u compile\u args

,感谢您的快速响应。将其添加到setup.py不会改变任何内容。我注意到,在调用setup.py之后,我得到了警告
clang:warning:-lboost\u system:'linker'input unused
clang:warning:-lboost\u math:'linker'input unused
。它似乎可以或不可以使用这些。知道为什么吗?我使用swig生成包装,它相当长。我在问题中添加了生成包装器的代码。另外,头文件现在包含了.Aha,因此您没有使用Boost.Python包装,而是使用SWIG包装。在这种情况下,在
setup.py
中,将源代码设置为仅为接口文件,即
sources=['example.i']
谢谢,但执行此操作后,代码不会被编译。到目前为止,我所做的是生成包装器
swig-c++-python example.I
,然后通过执行
python setup.py build\u ext--inplace
调用我的setup.py。在我尝试包含boost库之前,它一直有效。我怀疑这不是swig应该使用的方式。您已经链接到了
boost\u math
——您的问题可能在包装层。
Symbol not found: __ZN5boost4math12sph_hankel_ ...