user-0 提问: 目标文件（.a或.obj）之间的链接算静态链接吗？

回复:
user: user-1
content: 请问楼主这个问题解决啦吗，大家的回复对你有帮助吗？

user: user-2
content: bucuo                             不错

user: user-3

user: user-4
content: 准确的说，静态链接这个概念发生在可执行链接之前。静态链接是库链接，是编译时的操作。可执行链接是把目标文件接入系统执行方案的操作。

user: user-5
content: 自己动手搜索了一下，没有找到static link，static-link的字典式解释。（当然，这不等于它不存在。） 所以一边喝茶，一边捋一捋我主观理解的“静态链接”的由来。  起初，没有操作系统，没有高级语言，没有文件系统，自然是在物理地址上编程，没有链接。 那么链接/link应该出现在有了文件系统/操作系统/汇编语言的时代，用来在分模块的程序设计中主要表达两个意思：模块间符号解析和调用地址绑定（重定位）。 这个词出现初期，还没有库，只有分别编译/汇编的模块。后来出现了库，链接扩展了它的含义也处理库里的模块。  随着操作系统的进化，忽然有一天（浪漫说法）出现了动态链接，也就是运行时模块间符号解析与模块调用的地址绑定，链接再次扩展其含义以接受动态。 从这时起，为了与新技术进行区别，传统生成可执行文件前的链接方式就都被称为静态链接。  这就是我为什么那样认为，因为这个词本来就是作为新定义的动态链接概念的补集而出现的，而不是独立定义的，所以没有留下缝隙（既不动态也不静态的链接行为）。  我一直强调主观性，心虚。 各位老师如果也是归纳式理解，我们就各说各的好了；如果有权威解释，欢迎指出我的错误，我改。

user: user-6
content: 那应该称呼为什么？

user: user-5
content: 补丁：#6的“两行以上”是“这句话上方两行距离提到的”的意思，敲的时候欠考虑了，易生歧义。

user: user-5
content: 我一直觉得， 静态链接库 是 供静态链接过程使用的库 的意思， 并没有“甩开我就都不算静态链接”的语义 。

user: user-5
content: 看来这个问题变成语文问题了 可以先约定一下确切的词汇语义和讨论范畴。  个人仍然认为，我们在讨论C语言， 立足于主函数和主函数所在的文件， 那么其他处于另外文件的函数， 只要是在运行以前，确切地说是生成可执行文件以前， 招招手呼叫一下，就从其他目标文件飘过来一个函数的二进制代码， 拼装到我的产品内， 这个过程就都算静态链接。 链接，说的就是两行以上的拼装过程，当然还有各种细节， 静态，强调的是运行前，代码进入可执行文件， 和代码的来源并没有什么必然联系。  欢迎咬文嚼字批判我。

user: user-7
content: 静态链接是专指库文件的链接方式，所以不能说 .o 也是静态链接。 .o 通过 ar 打包成了 .a，链接的时候 .a 也会解包成 .o，再使用链接 .o 的方式链接

user: user-8
content: 不算

user: user-5
content: 没办法，自学的局限性，归纳式理解术语确实理解不精确。 一直主观认为链接是个动词，静态和动态是它的修饰，但不妨碍作为词组的静态链接和动态链接都是作为动词描述一个过程的。 静态链接描述的是生成过程中，复制目标代码进入可执行文件并进一步处理重定位等细节的过程，终止于出错或可执行文件生成。 而与之相对的动态链接用于描述可执行文件载入内存准备运行的时候和内存中的不属于这个可执行文件的二进制代码对接协调的过程。（这里的术语又不专业了）  所以请教一下静态链接这个词的比较精确的字典式定义出自哪里？求指点。

user: user-8
content: .o组合为.a/.lib或.so/.dll或.out/.exe发生在生成时，此时应该没有静态/动态link一说。 非要说对某个函数的调用是静态链接还是动态链接，得看下面运行时对函数实际调用得情况：  当.out/.exe被运行后，调用的函数只要来自.out/.exe文件内，该函数就是静态链接；反之，不是来自.out/.exe文件内，而是来自外部.so./.dll就是动态链接。  个人理解，不喜勿喷。

user: user-7
content: 引用 22 楼 forever74 的回复:那么NorZ老师认为，静态链接和动态链接这两个术语只用于描述对库的引用，我们这里讨论的项目里两个源文件之间的普通链接过程和这两个术语无关。 我们的分歧确实是语文问题，不在于实质。  那么赵4老师，您给出的参考资料的52页上这段话描述的是两个源文件的链接过程，这段的末尾指出作者认为这个属于静态链接啊，您为什么据此认为不算呢？   你要是把随意使用专业术语，当作是语文问题...那也是你的语文理解不到位 包括你引用的这本书的内容。注意看最后一句话，前面的句号，最后一句只是表述前面的描述是“静态链接的最基本的过程”，并没有说前面的描述就是静态链接。

user: user-0
content: 引用 21 楼 flying_music 的回复:[quote=引用 3 楼 六道佩恩 的回复:][quote=引用 1 楼 flying_music 的回复:]目标文件之间只能算是打包吧，只是物理的组合，并没有重定位等一系列操作，所以一般不叫"链接"  你说的是目标文件组合成静态库吗？（可能是我没懂起你说的）  目标文件之间的函数调用、全局变量访问这些不是会有重定位吗？[/quote] 重定位只会发生在生成可执行文件时，多个库组成一个库就只是打包，“打包”“链接”“静态链接”“动态链接”这些都是比较专业的词，最好不要乱用，虽然基本也能明白[/quote]  我说的不一直都是目标文件链接成exe吗？

user: user-5
content: 那么NorZ老师认为，静态链接和动态链接这两个术语只用于描述对库的引用，我们这里讨论的项目里两个源文件之间的普通链接过程和这两个术语无关。 我们的分歧确实是语文问题，不在于实质。  那么赵4老师，您给出的参考资料的52页上这段话描述的是两个源文件的链接过程，这段的末尾指出作者认为这个属于静态链接啊，您为什么据此认为不算呢？

user: user-9
content: 引用 3 楼 六道佩恩 的回复:[quote=引用 1 楼 flying_music 的回复:]目标文件之间只能算是打包吧，只是物理的组合，并没有重定位等一系列操作，所以一般不叫"链接"  你说的是目标文件组合成静态库吗？（可能是我没懂起你说的）  目标文件之间的函数调用、全局变量访问这些不是会有重定位吗？[/quote] 重定位只会发生在生成可执行文件时，多个库组成一个库就只是打包，“打包”“链接”“静态链接”“动态链接”这些都是比较专业的词，最好不要乱用，虽然基本也能明白

user: user-10
content: 库(.lib、a等等)是目标文件(.obj、.o之类)的合集，链接是以目标文件为单位的，链接单独的目标文件也是可以的

user: user-7
content: 引用 18 楼 forever74 的回复:所以精确一些描述， 在链接/连接这个范畴/全集下， 1、静态链接无疑是个子集，动态链接也是，那么静态链接子集和动态链接子集的并集（我们这里不讨论交集）有没有非空补集？有的话叫做什么？ 2、main.o和fun.o的链接，main.obj和fun.obj的链接，在这个语境里完全是同义，它在静态链接子集里，还是在补集里？  我完全没有引经据典，全凭不知来源的记忆和主观理解，认为， 1、不存在这个补集 2、所以它只能落进静态链接圈  静态链接和动态链接，只是链接库文件的方式。 从来没有.o 文件的动态和静态链接之说。 .o 文件的链接过程就大概就叫做链接 linking 吧，和库文件的链接过程是不同

user: user-5
content: 所以精确一些描述， 在链接/连接这个范畴/全集下， 1、静态链接无疑是个子集，动态链接也是，那么静态链接子集和动态链接子集的并集（我们这里不讨论交集）有没有非空补集？有的话叫做什么？ 2、main.o和fun.o的链接，main.obj和fun.obj的链接，在这个语境里完全是同义，它在静态链接子集里，还是在补集里？  我完全没有引经据典，全凭不知来源的记忆和主观理解，认为， 1、不存在这个补集 2、所以它只能落进静态链接圈