痛饮错误:未定义的符号

Posted

技术标签:

【中文标题】痛饮错误:未定义的符号【英文标题】:swig error: Undefined Symbol 【发布时间】:2012-02-01 15:58:47 【问题描述】:

我在喝 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】:

我们可以使用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。 (名字有猜测)。

【讨论】:

感谢c++filt 提示。太棒了! 我在这里参加聚会真的很晚了,但我遇到了同样的问题。当我不使用 SWIG 时,我的 CPP 代码运行良好,但是当我使用 SWIG 并尝试运行我的 Python 脚本时,我收到“未定义符号”错误。您能否扩展“您已将包装器构建到共享对象,但未将您编译的 ColourOperations.cpp 链接到该对象”?此外,在您链接的帖子中,我不明白他们在第三行 gcc 中所做的事情。对于我的情况,我只执行了与前两个类似的操作。 通常你最终会得到两个共享库。首先是您实际要包装的库。其次,库是您的目标语言需要作为语言扩展加载的共享对象,swig bit。需要确保加载语言扩展会加载它所包装的真实库,否则你会得到这样的错误。这可以通过几种方式完成,如果您要包装的库是静态的,那么(正确地)链接它就足够了。如果它是一个共享库,您也可以再次链接它。或者您可以手动使用 dlopen。

以上是关于痛饮错误:未定义的符号的主要内容,如果未能解决你的问题,请参考以下文章

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?

什么是未定义的引用/未解决的外部符号错误,我该如何解决?