3

swig に問題があり、コードのデータ メンバーの 1 つが未定義のシンボルであると言っているように見えます。関数を修正する方法についてオンラインで回答を見つけましたが、これは私を困惑させています。

私のエラーは次のとおりです。

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

1 に答える 1

17

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(名前は憶測でした)。

于 2012-02-01T20:09:05.950 に答える