ошибка swig: неопределенный символ

У меня проблемы с 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;
}

person Justin Kern    schedule 01.02.2012    source источник


Ответы (1)


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

c++filt _ZN13ConstantColorC1ESt10shared_ptrI5ColorE

Что дало:

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

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

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

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

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

person Flexo    schedule 01.02.2012
comment
Спасибо за совет c++filt. Это потрясающе! - person jorgeca; 18.12.2012
comment
Я действительно опаздываю на вечеринку, но у меня та же проблема. Мой код CPP работает нормально, когда я не использую SWIG, но когда я использую SWIG и пытаюсь запустить свой скрипт Python, я получаю ошибку «Неопределенный символ». Можете ли вы расширить, что вы создали свою оболочку... для общего объекта, но не связали свой скомпилированный ColourOperations.cpp с этим объектом? Кроме того, в сообщении, на которое вы ссылаетесь, я не понимаю, что они делают в третьей строке gcc. Я выполнял только первые два для моей ситуации. - person Alex Eastman; 22.07.2020
comment
Часто вы получите две общие библиотеки из этого. Есть библиотека, которую вы на самом деле хотите обернуть в первую очередь. Во-вторых, есть библиотека, которая является общим объектом, который ваш целевой язык должен загрузить как расширение языка, бит swig. Что-то должно гарантировать, что загрузка языкового расширения загружает настоящую библиотеку, в которую оно заключено, иначе вы получите подобные ошибки. Это можно сделать несколькими способами, если библиотека, которую вы оборачиваете, является статической, то достаточно связать ее (правильно). Если это общая библиотека, вы также можете связать ее снова. Или вы можете вручную использовать dlopen. - person Flexo; 23.07.2020