gpt4 book ai didi

c++ - 共享对象文件中的 undefined symbol

转载 作者:行者123 更新时间:2023-11-28 06:42:20 25 4
gpt4 key购买 nike

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

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)

但是,这个“size”函数是在“/rw/include/”中的头文件中定义和实现的:

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

'_size' 也在其正下方定义。

我是否错误地编译了这段代码?还有其他可能的问题,这可能是某种转移注意力的问题吗?

最佳答案

-fno-implicit-templates意思是“不要实例化我使用的模板,我将通过提供显式实例化来手动执行此操作。”

所以你欺骗了编译器。你告诉它不要费心实例化 Array<T>::size function template 以提供所需的符号,所以它按照你的要求做了,但你没有遵守约定。

最好的解决方案是停止使用该选项,让编译器自动执行正确的操作。当您使用 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);

关于c++ - 共享对象文件中的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25753308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com