编译时,这个:
template <typename T>
struct ConstArray {
///MEMBERS
T* data_;
T* end_;
///Constructors
ConstArray(T* data, T* end) : data_(data), end_(end) {}
};
template struct ConstArray<const char>;
给我(nm -C *.o
):
0000000000000000 W ConstArray<char const>::ConstArray(char const*, char const*)
0000000000000000 W ConstArray<char const>::ConstArray(char const*, char const*)
0000000000000000 n ConstArray<char const>::ConstArray(char const*, char const*)
对于我定义的每个构造函数,我似乎得到了三个符号(2 W + 1 n(不知道那是什么))。函数似乎只给我预期的一个。 有人可以解释这是为什么还是给我一个解释?
最佳答案
也许我能明白为什么这个符号出现在 nm
输出中,但我不知道它是否应该/不应该在那里以及 n
到底是什么意思。也许如果有人熟悉这一点,他可以发布完整的答案。
如果你执行 objdump -t ./obj.o
你可以看到一个符号表。除了 2 个构造函数和我看到的许多其他符号
00000000 l .group 00000000 _ZN10ConstArrayIKcEC5EPS0_S2_
那里。该标志只有 l
,这意味着它是本地的而不是调试的,所以我在 nm
输出中看到它作为第三个符号。
如果我执行 nm -g ./obj.o
只看到外部符号,我只会看到 2 个 W
构造函数,而当我执行 nm -a ./obj.o
我看到了所有符号,并且还在 objdump -x
中标记为 debug
。我还看到一些调试符号在 nm -a
输出中标记为 n
。
所以我不知道n
是什么意思,但是第三个符号在某种程度上与elf
文件的.group
部分相关。它负责将符号组合在一起。
关于c++ - 构造函数符号过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738305/