C ++运行时链接错误的含义?

时间:2010-12-17 09:44:37

标签: c++ dynamic-linking

我遇到了运行时错误。

  

anyfile.cpp(60):E_FATAL:不能   启动进程libprocbase_so.so   (/opt/company/processes/sharedbase_so.so:   未定义的符号:   _ZTV16CResourceManager)

我发现_ZTV16CResourceManager的含义是资源管理器的虚拟表,

知道为什么会这样吗?怎么解决呢?

2 个答案:

答案 0 :(得分:5)

问题在于,在加载动态库(sharedbase_so.so)时,它无法解析符号。尝试找到符号定义的库(如果有),并确保ld可以加载它(将其添加到路径中)。如果它不存在于任何动态库中,请返回目标文件并尝试确定它的位置以及为什么它没有进入二进制文件。

这可能是一个问题的常见情况是主要定义为内联的类,如:

struct test {
   virtual void foo() {}
   //virtual void bar();
};

如果注释掉bar的行,则编译器将在包含它的所有翻译单元中将vtable生成为弱符号。如果取消注释bar,则编译器不会在每个翻译单元中生成vtable,而只会在定义test::bar的翻译单元中生成vtable。确保即使您不使用test::bar,目标文件也会在库中链接。

答案 1 :(得分:1)

您在哪里声明了ResourceManager类?

似乎未加载此库 - 当您使用运行时链接时,您必须以正确的顺序手动加载所有依赖项。