C++ 对象文件不包含应该存在的符号

C++ 对象文件不包含应该存在的符号,c++,com,C++,Com,这是我得到的具体错误: libFoo.so: undefined reference to `IID_IFOOBAR' collect2: ld returned 1 exit status make: *** [/home/F.exe] Error 1 当我尝试检查对象文件A.o中的符号时 nm A.obj | grep IID_ 我在“IID_IFOOBAR”的对象文件中没有列出应该存在的符号,因为它在头文件中定义为: extern const blahType IID_IFOOBAR

这是我得到的具体错误:

libFoo.so: undefined reference to `IID_IFOOBAR'
collect2: ld returned 1 exit status
make: *** [/home/F.exe] Error 1
当我尝试检查对象文件A.o中的符号时

nm A.obj | grep IID_
我在“IID_IFOOBAR”的对象文件中没有列出应该存在的符号,因为它在头文件中定义为:

extern const blahType IID_IFOOBAR
我错过什么了吗?既然IID_IFOOBAR是一个外部变量,那么它的定义是否应该有所不同?如果这个问题太具体,我会删除它。但也许有人的直觉会对我有所帮助。

[编辑] 在某个地方添加变量的定义(不带
extern
)。没有初始值设定项的外部标识符不是定义-定义必须在其他地方。

[编辑]
在某个地方添加变量的定义(不带
extern
)。没有初始值设定项的外部标识符不是定义-定义必须在其他地方。

要使
Extern
ly声明的符号在符号表中显示为“未定义”,您应该实际从库中使用它


如果对象文件既不包含符号定义(与声明相反),也不在其函数中的某个位置使用符号,则符号将不会出现在符号表中。为什么要这样做?

要使
外部声明的符号在符号表中显示为“未定义”,实际上应该从库中使用它


如果对象文件既不包含符号定义(与声明相反),也不在其函数中的某个位置使用符号,则符号将不会出现在符号表中。为什么要这样做呢?

看看
nm-D
nm-g
nm-u
的输出,看看输出有什么不同。@greyfade,刚刚试过了nm-D:没有符号nm-g:列出了其他符号,但不是我要找的符号nm-u:列出了“u”符号,但不是我要找的符号查看
nm-D
nm-g
nm-u
并查看输出的不同之处。@greyfade,刚刚尝试了它nm-D:没有符号nm-g:列出了其他符号,但不是我要找的符号nm-u:列出了“u”符号,但不是我要找的符号,但也应该有一个(而且只有一个)在某个地方的.c/.cpp文件中定义。我将接受这个答案,因为它是正确的。我发现了问题所在。定义需要位于意外的位置,以便外部可以保留。谢谢我稍微修改了一下答案。如果你想有外部链接,外部必须在某个地方,只是你还需要有定义。如果变量也被标记为
const
,那么带有初始化器的变量上的
extern
关键字不会被忽略,因为在这种情况下
extern
提供了外部链接。在这种情况下,添加一个初始化器会起作用并满足ODR的要求。当然,
extern
将毫无意义,因为变量在使用它的任何地方都定义了。:)呜呜,我忘记了链接器不会对多个符号感到满意的事实,因为它被标记为extern。但是在.c/.cpp文件的某个地方也应该有一个(而且只有一个)定义。我会接受这个答案,因为它是正确的。我发现了问题所在。定义需要位于意外的位置,以便外部可以保留。谢谢我稍微修改了一下答案。如果你想有外部链接,外部必须在某个地方,只是你还需要有定义。如果变量也被标记为
const
,那么带有初始化器的变量上的
extern
关键字不会被忽略,因为在这种情况下
extern
提供了外部链接。在这种情况下,添加一个初始化器会起作用并满足ODR的要求。当然,
extern
将毫无意义,因为变量在使用它的任何地方都定义了。:)呜呜,我忘记了链接器不会对多个符号感到高兴的事实,因为它被标记为extern。