2012-02-01 7 views
3

У меня проблемы с swig, и для меня это похоже на то, что один из элементов данных моего кода является неопределенным символом. Я нашел ответы в Интернете о том, как исправить функции, но это меня озадачивает.swig error: Undefined Symbol

Моя ошибка:

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 или других файлах может объяснить, почему что-то думает, что существует не ссылочная версия.

Другим вероятным объяснением этого может быть то, что вы создали свою обертку (то есть скомпилированный файл volume_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