ошибка swig: неопределенный символ - PullRequest
3 голосов
/ 01 февраля 2012

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

Моя ошибка:

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;
}

1 Ответ

13 голосов
/ 02 февраля 2012

Мы можем удалить имя символа с помощью c++filt:

c++filt _ZN13ConstantColorC1ESt10shared_ptrI5ColorE

, что дало:

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

т.е. ваш конструктор, который принимает shared_ptr.Однако будет сообщено только о первом неразрешенном символе.

Обратите внимание, что здесь это , а не ссылка, но ваш конструктор выглядит так, как будто он принимает ссылку.Возможная опечатка где-то в вашем .i или других файлах может объяснить, почему кто-то думает, что существует нереференсная версия.

Другое вероятное объяснение этого может быть в том, что вы создали свою оболочку (то есть скомпилированные объемы_wrap.cxx) к общему объекту, но не связал ваш скомпилированный ColourOperations.cpp с этим объектом.

В качестве альтернативы возможно, что если вы связали его , вы связали его в неправильном порядке итаким образом он был признан компоновщиком не нужным.Если это так, убедитесь, что у вас есть -lcolour_library / colour_library.a / ColorOperatios.o последний в командной строке компоновщика.(Название было домыслом).

...