如果我在库和应用程序中编译了相同的cpp文件,该怎么办?

时间:2019-06-26 09:30:31

标签: c++ gcc linker

一些理论问题(而不是一个具体的例子),我以为我已经理解了,但是现在我又有了疑问...

场景:

  1. 我们有一个名为bob的通用类,它是仅标头的实现。

  2. 我们有一个使用bob的库(lib1)(这样bob在编译的库中定义)。

  3. 我们还有一个使用bob的应用程序(exe1)(这样bob在编译的可执行文件中定义)。

现在boblib1中都存在(afaik)exe1的定义。如果我尝试将lib1链接到exe1 ...会发生什么?

如果我将类bob做成.cpp和.hpp文件对并在库和可执行文件中编译cpp文件,是否有任何区别?或者这基本上是同一回事吗?

我的问题确实与两个二进制文件中的定义有关,链接器实际上对所有这些做了什么? (代码很简单)。我的理解是,这总是会导致重新定义bob错误,但我似乎没有看到这一点。

可以表示我做错了什么-所以我想和大家确认我认为正确的事情吗?

1 个答案:

答案 0 :(得分:2)

  

现在,lib1和exe1中都存在(afaik)bob的定义。如果我尝试将lib1链接到exe1,会发生什么情况?

链接器将使用exe中bob的定义,而忽略lib1中的定义(无论库是静态的还是动态的)。这是因为链接器仅在库中搜索未解决的符号。

但是,它尝试链接两个都包含bob定义的目标文件,然后出现多个符号定义错误,因为链接器提取了目标文件的全部内容(与库不同)。

以上内容仅适用于具有外部链接的非内嵌符号。