C++ 在构建时是否发生了特定于静态链接的任何事情

C++ 在构建时是否发生了特定于静态链接的任何事情,c++,linker,static-linking,scons,dynamic-linking,C++,Linker,Static Linking,Scons,Dynamic Linking,我尝试使用链接器中的static选项静态链接一些构建的库。我正在使用SCON编译/链接库。我的印象是静态构建发生在链接时,因此链接什么并不重要。我遇到了一系列错误,我想知道静态链接到库的.o文件和动态链接到库的.o文件之间是否有区别。理论上,这些应该是相同的吗?我不太了解SCON,但据我所知,它与其他make系统类似,仍然执行相同的编译/链接步骤。链接的体系结构已经存在,因此我将尝试解释这些差异 由于静态库的目的是在链接时将符号解析到可执行文件中,所以它们不需要任何特殊的东西,因为解析发生在编译

我尝试使用链接器中的static选项静态链接一些构建的库。我正在使用SCON编译/链接库。我的印象是静态构建发生在链接时,因此链接什么并不重要。我遇到了一系列错误,我想知道静态链接到库的.o文件和动态链接到库的.o文件之间是否有区别。理论上,这些应该是相同的吗?

我不太了解SCON,但据我所知,它与其他make系统类似,仍然执行相同的编译/链接步骤。链接的体系结构已经存在,因此我将尝试解释这些差异

由于静态库的目的是在链接时将符号解析到可执行文件中,所以它们不需要任何特殊的东西,因为解析发生在编译时。动态库需要特别考虑,因为它们是在运行时解析的,链接器不知道如何使用它们。您将需要特殊的标志(例如,fPIC标志,使代码可以在内存中的任何位置运行)


因此,简单的回答是,是的,存在差异。据我所知,为动态链接生成的对象文件可以转换为静态库(有一些),但大多数为静态链接生成的对象文件不能用于动态链接,因为它们可能没有必要的标志。我通常(非正式地)认为它是一个静态库,类似于另一个对象文件,而动态库则类似于一个独立的可执行文件,只是挂接在其中(实际上更接近于共享库常用的格式)。

在一般情况下,静态库和动态库不能互换使用。见:

关于你的实际问题:

。。。如果指定静态链接到库的.o文件与指定动态链接到库的.o文件之间存在任何差异。理论上,这些应该是相同的吗

不,它们不应该是一样的。两者之间存在差异,最显著的可能是动态库有一个非空的
.dynsym
部分

如果函数
foo()
静态链接到应用程序中,那么函数定义将位于相对于其余应用程序代码的固定(静态!)位置

另一方面,如果我们将
foo()
动态链接到我们的应用程序中,那么在编译时,应用程序无法知道在执行过程中在哪里可以找到
foo()
的定义,因为应用程序不能对库进行任何假设——既不能对库在运行时的位置进行假设,也不能对库的内部结构进行假设。因此,库本身提供了一个节
.dynsym
,以便客户端代码能够找到
foo
的定义,尽管在complie时间还不清楚这将在哪里