我知道所有编译文件(翻译单元)都会被编译为目标文件,然后链接器会通过查看这些目标文件来解析编译器在编译阶段找不到的符号。但这也是链接到静态库时发生的情况。那么链接到预编译的静态库和链接到目标文件有什么区别呢?我有一个大约 300k 行的 c 文件(sqlite),我想知道我是否应该将其编译为静态库,而不是仅将 c 文件作为编译单元传递给编译器。我知道在这两种情况下,编译器直到链接阶段才会“看到”该文件中的代码。我想有一次我在试验这些东西时,我看到了最终二进制大小的差异,但我不记得我是否正确设置了优化设置(即函数级链接 -ffunction-sections -fdata-sections)。
假设其他所有条件都相同,则链接独立目标文件获得的结果与链接从静态库中提取的相同目标文件获得的结果之间没有任何区别。
静态库的主要用途是
当然,第一种也可以通过保留构建的目标文件来实现。如果我们谈论的是只在单个项目中使用的东西,那么保留目标文件就更简单了,而且不需要考虑重用。
在某些构建系统中,静态库可能具有组织优势,但这是一个相当特殊的情况,如果它与您相关,您就会认识到这一点。