共享对象文件中的未定义符号

时间:2014-09-09 20:47:19

标签: c++ templates g++ undefined-reference

我使用以下代码编译了我的代码:

gcc -c -O3 -fPIC -fno-rtti -fno-implicit-templates -Wno-deprecated -I. -I/rw/include/ Exotic.C -o RBCExotic.o

当我尝试使用' RBCExotic.o'文件,我收到以下错误。

loading error /home/rw/rw_lib/Exotics.so: undefined symbol: _ZN5ArrayIPKvE4sizeEibbb

当我使用nm解码代码时,给出错误的行是:

U Array<void const*>::size(int, bool, bool, bool)

然而,这个&#39;尺寸&#39;功能是在&#39; / rw / include /&#39;中的头文件中定义和实现的。就这样:

template <class T>
int
Array<T>::size(int n, bool reduceMem, bool copyData, bool delData)
{
    return _size(n, reduceMem, copyData, delData);
}

并且&#39; _size&#39;也在它下面定义。

我是否错误地编译了此代码?还有其他可能的问题,这可能是某种红鲱鱼吗?

2 个答案:

答案 0 :(得分:2)

-fno-implicit-templates表示“不实例化我使用的模板,我将通过提供显式实例化来手动执行。”

所以你骗了编译器。你告诉它不要打扰实例化Array<T>::size功能模板以提供所需的符号,所以它按照你的要求做了,但是你没有保留你的讨价还价。

最好的解决方案是停止使用该选项,让编译器自动执行正确的操作。当您使用Array<void const*>::size(int, bool, bool, bool)时,它将在头文件中实例化通用定义并提供缺少的符号。

有关详细信息,请参阅GCC manual,但该页面已过时,应忽略-frepo是最佳选项。最好的选择是第三个。

如果您确实想要使用该选项,则需要为您使用的每个模板提供显式实例化(这是GCC文档中的第二个选项)。在.C文件(不是标题)中定义Array<void const*>的显式实例化,如下所示:

template class Array<void const*>;

或单个功能:

template int Array<void const*>::size(int, bool, bool, bool);

答案 1 :(得分:-1)

我看到你包括头文件(-I)。那是Mac吗?我不认识这些路径。 也许这可以帮到你:

clang++ -stdlib=libc++ leads to undefined reference

我见过

g++ -std=c++11 your_file.cpp -o your_program -I(as necessary)

在别处使用。