一些理论问题(而不是一个具体的例子),我以为我已经理解了,但是现在我又有了疑问...
场景:
我们有一个名为bob
的通用类,它是仅标头的实现。
我们有一个使用bob的库(lib1
)(这样bob在编译的库中定义)。
我们还有一个使用bob的应用程序(exe1
)(这样bob在编译的可执行文件中定义)。
现在bob
和lib1
中都存在(afaik)exe1
的定义。如果我尝试将lib1
链接到exe1
...会发生什么?
如果我将类bob
做成.cpp和.hpp文件对并在库和可执行文件中编译cpp文件,是否有任何区别?或者这基本上是同一回事吗?
我的问题确实与两个二进制文件中的定义有关,链接器实际上对所有这些做了什么? (代码很简单)。我的理解是,这总是会导致重新定义bob
错误,但我似乎没有看到这一点。
这可以表示我做错了什么-所以我想和大家确认我认为正确的事情吗?
答案 0 :(得分:2)
现在,lib1和exe1中都存在(afaik)bob的定义。如果我尝试将lib1链接到exe1,会发生什么情况?
链接器将使用exe中bob的定义,而忽略lib1中的定义(无论库是静态的还是动态的)。这是因为链接器仅在库中搜索未解决的符号。
但是,它尝试链接两个都包含bob定义的目标文件,然后出现多个符号定义错误,因为链接器提取了目标文件的全部内容(与库不同)。
以上内容仅适用于具有外部链接的非内嵌符号。