- 主题:G++ 4.8.5 链接时 namespace 相关问题
我公司服务器的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.*
其实开始声明和实现都没用 namespace, 之后出错了就都套了,但是还是链接失败。
参数列表里面的类型 T 我试过在外面用 using some_ns::T 还有 typedef some_ns::T T,结果也是一样。
【 在 fanci (大葡萄) 的大作中提到: 】
: “这个 some_func 在一个 C++ 文件里面实现的。” 实现的时候套 some_ns 里面了吗,比如using就不行
--
FROM 114.253.241.*
我刚才改用GCC 9.2.0构建我的代码,试过在参数列表和实参的声明里面都加上 some_ns::,最后还是因为出现了一个参数列表没有 namespace 的函数符号而链接出错。
此外这个项目在链接之前还做过目标文件的部分链接,就是把一部分.o链接成一个大的.o,这个过程我怀疑过,但没法确定是不是它的问题。
还有一点我不明白的是,我不知道为什么这个函数会产生一个位于 BSS 的符号 some_ns::func(...)::once,其他函数好像没有。
【 在 hoodlum (hoodlum) 的大作中提到: 】
: 可能全局里面有这个 T?
: 你声明这个函数的时候就把参数写成 some_ns::T 呢。
--
FROM 114.253.241.*
今天把这个问题重现了,可以确定是GCC的问题。
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101774
【 在 ArchLinux (a lightweight and flexible distribution) 的大作中提到: 】
: 我公司服务器的GCC是4.8.5版本,今天碰到一个很奇怪的错误。我在一个头文件声明了函数
: namespace some_ns {
: void some_func(T &, const T*);
: ...................
--
FROM 103.90.178.*