2012-02-01 61 views
3

我遇到了swig問題,對我來說,它看起來像是說我的代碼的其中一個數據成員是未定義的符號。我在網上找到了關於如何修復功能的答案,但這令我感到困惑。swig error:未定義的符號

我的錯誤是:

Traceback (most recent call last): 
    File "./test1.py", line 5, in <module> 
    from volumes import * 
    File "/scratch/rjkern/projects/RJKERN_volrend/scripts/volumes.py", line 26, in <module> 
    _volumes = swig_import_helper() 
    File "/scratch/rjkern/projects/RJKERN_volrend/scripts/volumes.py", line 22, in swig_import_helper 
    _mod = imp.load_module('_volumes', fp, pathname, description) 
ImportError: /scratch/rjkern/projects/RJKERN_volrend/scripts/_volumes.so: undefined symbol: _ZN13ConstantColorC1ESt10shared_ptrI5ColorE 

這是我的代碼:

/* 
* ColorOperations.h 
*/ 

#ifndef ___COLOROPS___ 
#define ___COLOROPS___ 

#include "Color.h" 
#include "ProgressMeter.h" 
#include "Vector.h" 
#include "Volume.h" 
#include "VolumeOperations.h" 

#include <memory> 

using namespace std; 

class ConstantColor : public Volume<Color>{ 
    shared_ptr <Color> color; 

public: 
    ConstantColor(const shared_ptr<Color>& _color); 

    const Color eval(const Vector& P) const; 
    Color grad(const Vector& P); 
}; 
#endif 

和:

/* 
* ColorOperations.cpp 
*/ 

#include "ColorOperations.h" 

ConstantColor::ConstantColor(const shared_ptr<Color>& _color){ 
    color = _color; 
} 

const Color ConstantColor::eval(const Vector& P)const{ 
    return *color; 
} 

回答

12

我們可以c++filt去裂傷符號名稱:

c++filt _ZN13ConstantColorC1ESt10shared_ptrI5ColorE 

這給了:

ConstantColor::ConstantColor(std::shared_ptr<Color>) 

即你的構造,這需要shared_ptr。只有第一個未解決的符號會被報告。

請注意,這裏的不是的引用,但是您的構造函數看起來像需要引用。在.i或其他文件中的某處可能會出現拼寫錯誤,可能會解釋爲什麼某些事情認爲有非引用版本。

另一種可能的解釋是,你已經將你的包裝器(即編譯的volumes_wrap.cxx)構建到共享對象上,但是沒有將你編譯的ColourOperations.cpp鏈接到該對象。

或者,如果你有已連接,你可能linked it in the wrong order and thus it was judged as not needed by the linker。如果是這種情況,請確保在鏈接器命令行上保留-lcolour_library/colour_library.a/ColorOperatios.o。 (這個名字有推測)。

+2

感謝您使用'C++ filt'提示。這很棒! – jorgeca 2012-12-17 21:52:31