在 C++ 中编译使用另一个库的库

Enh*_*nce 0 c c++

我不太明白使用另一个库的库的编译是如何工作的。据我了解,有 4 种情况:

1) 编译使用静态库 (B) 的静态库 (A) :编译会起作用,但链接库 A 不起作用,因为静态库只是包含 A 编译产生的 .o 文件的存档,而不是来自B。是不是在创建静态库时,编译阶段会搜索函数定义并在头中找到它们。在链接阶段,编译器在库 B 中搜索函数实现,如果找到则编译成功,但实际上并没有将函数实现放在静态库 A 中。这就是为什么在链接 A 时它没有工作

2) 编译使用动态库的静态库:我认为创建 A 和使用 A 都可以,但为什么呢?编译器实际上在 dlls/so 中放了什么?

3) 编译使用静态库的动态库:这行得通吗?

4) 编译一个使用另一个动态库的动态库:这也行吗?

谢谢你的时间。

Cod*_*odo 8

如果您使用 C 或 C++ 创建库或程序,则构建过程包括两个步骤:

  1. 将每个 C/C++ 文件编译成目标文件

  2. 链接目标文件并创建库或可执行文件(如果您创建静态库,它并不是真正的链接;但为了简单起见,让我们使用这个词。)

合规

如果编译使用库的代码,则需要库的头文件 (.h)。它们在库中声明公共函数和类。您不需要二进制文件进行编译。

链接

对于链接步骤,您需要静态或动态库的二进制文件(静态库为 .lib 或 .a,动态库为 .dll 或 .so)。

库之间的依赖

如果你创建一个静态库,你所有的目标文件将被放入一个新的库文件中。使用的库(静态或动态)中的任何内容都不会包含在内。但是当有人使用您的库时将需要它。所以你的图书馆不是独立的。

如果您创建动态库并使用静态库,则静态库中的必要代码将包含在您的动态库中。就使用的库而言,新的动态库将是自包含的。

如果您创建动态库并使用动态库,则只会包含对使用的库的引用。因此,要运行最终产品,新的和使用的库都需要可用。

  • 多年的经验,一点一滴,各种来源:书籍、手册、网络、调查和观察事物...... (2认同)