我不太了解使用其他库的库的编译是如何工作的。据我所知,有4个案例:
1)编译一个使用静态库的静态库(A):编译可以工作,但是对库A的链接不起作用,因为静态库只是一个包含.o文件的存档。 A的编译,而不是B的编译。在创建静态库时,编译阶段会搜索函数定义并在标题中找到它们。在链接阶段,编译器在库B中搜索函数实现,如果它找到它们,则编译成功,但它实际上并没有将函数实现放在静态库A中。这就是为什么当链接A,它没有工作
2)编译一个使用动态库的静态库:我认为A的创建和A的使用都可行,但为什么呢?编译器实际上在dll中放了什么?
3)编译一个使用静态库的动态库:这会有用吗?
4)编译使用另一个动态库的动态库:这也可以吗?
感谢您的时间。
答案 0 :(得分:1)
如果使用C或C ++创建库或程序,则构建过程包含两个步骤:
将每个C / C ++文件编译为目标文件
链接目标文件并创建库或可执行文件(如果您创建静态库,它不是链接;但为了简单起见,我们使用这个词。)
<强> Compliation 强>
如果编译使用库的代码,则需要库的头文件(.h)。它们声明了库中的公共函数和类。您不需要二进制文件进行编译。
<强>链接强>
对于链接步骤,您需要静态或动态库的二进制文件(静态库的.lib或.a,动态库的.dll或.so)。
库之间的依赖关系
如果创建静态库,则所有目标文件都将放入新的库文件中。消耗的库(静态或动态)中不包含任何内容。但是有人使用你的图书馆时会需要它。所以你的图书馆不是自包含的。
如果创建动态库并使用静态库,则静态库中的必要代码将包含在动态库中。就消费的库而言,新的动态库将是自包含的。
如果您创建动态库并使用动态库,则只会包含对使用的库的引用。因此,要运行最终产品,新的和消耗的库都需要可用。