【发布时间】:2014-01-18 01:33:35
【问题描述】:
我正在使用 swig 为 c++ 类编写一个包装器,以便与 python 一起使用。
当我尝试执行 from CSMPy import *(CSMPy 是我的模块)时,我收到以下消息:
ImportError: dlopen(/Users/MUL_mac2/anaconda/lib/python2.7/site-packages/_CSMPy.so, 2): Symbol not found: __ZN4csmp4VSetILm2EE6ResizeERKSt5dequeIiSaIiEERKS2_ImSaImEESA_m
Referenced from: /Users/MUL_mac2/anaconda/lib/python2.7/site-packages/_CSMPy.so
Expected in: dynamic lookup
一点背景:
我有一个接口文件,它包含一个包含我的包装类的头文件:
这个类有一个对象作为私有成员。
然后我想将一些std::deque<int> 类型的对象传递给一个成员函数
这个对象像这样:this->object.Function(int_deque_a,int_deque_b) 其中object 是我使用 swig 包装的类的成员。
当我评论以上行时,一切都像魅力一样。 我传递的所有容器都是有效的数据类型,可传递给此对象成员函数并包含正确数量的条目。
一切都会编译,这只发生在导入模块时。
我在这里错过了什么?
我正在使用 distutils 使用 python setup.py install 进行编译
setup.py:
CSMPy_module = Extension('_CSMPy',
include_dirs = [Bunch of include directories here],
library_dirs = ['MyLibraryPath'],
libraries = ['MyLibrary'],
sources=['CSMPy_wrap.cxx', 'WrapperClass.cpp'],
)
setup (name = 'CSMPy',
version = '0.1',
author = "My name",
description = """Simple Test""",
ext_modules = [CSMPy_module],
py_modules = ["CSMPy"],
)
MyLibrary 是一个静态库。
编辑 1: 我正在为您提供一个可以向所有人展示的代码版本
设置.h
#include <iostream>
#include <vector>
#include <deque>
#include "VSet.h"
class Setup {
public:
Setup();
~Setup();
void InitializeSetup();
private:
std::deque<size_t> npes;
std::deque<size_t> epes;
std::deque<std::vector<size_t> > eni; //plist
std::deque<std::vector<csmp::int32> > enb; //pfverts
std::deque<std::vector<csmp::double64> > ncl; //pelmt
std::map<size_t, csmp::int32> bnf; //bflags
std::deque<csmp::int32> et;
csmp::VSet<2U> v;
};
安装程序.cpp
#include "Setup.h"
Setup::Setup() {
std::cout<<"Setup initialized."<<std::endl;
}
Setup::~Setup() {
}
void Setup::InitializeSetup() {
for(size_t i = 0; i < this->eni.size(); i++) {
this->npes.push_back(this->eni[i].size());
}
for(size_t i = 0; i < this->enb.size(); i++) {
this->epes.push_back(this->enb[i].size());
}
this->v.Resize(this->et, npes, epes, this->ncl.size()); //This is the line that does not work
}
CSMPy.i
%module CSMPy
%{
#define SWIG_FILE_WITH_INIT
#include "stdlib.h"
#include <vector>
#include <deque>
#include <map>
#include "VSet.cpp"
#include "Setup.h"
#include "Number_Types.h"
%}
%include "Number_Types.h"
%include "std_map.i"
%include "std_vector.i"
%include "std_deque.i"
// Instantiate templates used by CSMPy
namespace std {
%template() pair<size_t, csmp::int32>;
%template() pair<size_t, csmp::double64>;
%template() pair<size_t, vector<size_t> >;
%template() pair<size_t, vector<csmp::int32> >;
%template() pair<size_t, vector<csmp::double64> >;
%template(Deque_SizeT) deque<size_t>;
%template(Deque_Int) deque<csmp::int32>;
%template(Vector_SizeT) vector<size_t>;
%template(Vector_Int32) vector<csmp::int32>;
%template(Vector_Double64) vector<csmp::double64>;
%template(Deque_Double64) deque<csmp::double64>;
%template(Deque_Vector_Int) deque<vector<csmp::int32> >;
%template(Deque_Vector_SizeT) deque<vector<size_t> >;
%template(Deque_Vector_Double64) deque<vector<csmp::double64> >;
%template(Map_SizeT_Int) map< size_t, csmp::int32>;
%template(Map_SizeT_Double64) map< size_t, csmp::double64>;
%template(Map_SizeT_Vector_SizeT) map< size_t, vector<size_t> >;
%template(Map_SizeT_Vector_Int) map< size_t, vector<csmp::int32> >;
%template(Map_SizeT_Vector_Double64) map< size_t, vector<csmp::double64> >;
}
%include "Setup.h"
编辑 2:
我做了 nm -gC myLib.so
我发现了这个回声
__ZN4csmp4VSetILm2EE6ResizeERKNSt3__15dequeIiNS2_9allocatorIiEEEERKNS3_ImNS4_ImEEEESC_m
c++ 倾斜告诉我:
csmp::VSet<2ul>::Resize(std::__1::deque<int, std::__1::allocator<int> > const&, std::__1::deque<unsigned long, std::__1::allocator<unsigned long> > const&, std::__1::deque<unsigned long, std::__1::allocator<unsigned long> > const&, unsigned long)
对此有几点说明,我已切换到使用 clang++ 作为我的编译器并手动编译。我还在我的 .i 文件中添加了#include "VSet.cpp"。 (参见上一篇文章中的编辑)
我现在在 python 中导入时遇到此错误:
Symbol not found: __ZN4csmp5VData6InTextERSt14basic_ifstreamIcSt11char_traitsIcEE
Referenced from: ./_CSMPy.so
Expected in: flat namespace
我还创建了一个用于实例化对象的 main,并且对 Initialize() 的调用有效。
【问题讨论】:
-
背景部分太难看懂,能不能贴一些代码(只是相关部分)?
-
我不能发布任何代码,因为它是专有的。我已经为你伪化了代码。
-
这可能与您编译和链接
CSMPy与gcc 的方式有很大关系。请提供用于构建模块的命令行。 -
我正在使用 distutils 来编译我的代码。如果可能的话,你能给我一个 gcc 命令来编译这个类吗?我正在使用 MacOSX Mavericks。
-
等等,包括 .cpp 确实改变了什么?现在您收到流链接错误?但是当你从 main.exe 运行它时它工作正常吗? main.exe 版本在更改之前是否也可以正常工作?调整大小是否使用 std::ifstream?如果是这样,如果您将 Resize 的那部分注释掉怎么办?你能解开吗,我现在不容易访问 c++filt。
标签: python c++ python-2.7 swig