我公司服务器的GCC是4.8.5版本,今天碰到一个很奇怪的错误。我在一个头文件声明了函数
namespace some_ns {
void some_func(T &, const T*);
}
其中这个类型 T 是 some_ns::T, 在另一个头文件里面定义了的。这个 some_func 在一个 C++ 文件里面实现的。构建项目的时候问题出来了,连接器说找不到符号 some_func(T &, T const*)
之后我用 nm 看了几个相关目标文件的符号,用 c++filt demangle C++ 的符号,结果发现找不到符号的那个目标文件里面同时出现了符号 some_func(T &, Tconst *) 和 some_func(some_ns::T &, const some_ns::T*),就是说参数表里面有 some_ns:: 和没有这个 namespace 前缀的两个函数原型构成了两个不同的符号,最后就出现了链接出错的问题。
最后我实在解决不了这个问题,因为这个函数只在一个文件里使用,所以我就把 C++ 文件里面的实现挪到头文件里面并让它成为 static 函数,这样就构建通过了。
--
修改:ArchLinux FROM 114.253.241.*
FROM 114.253.241.*