gpt4 book ai didi

C++ 构建过程 - lib 依赖项

转载 作者:可可西里 更新时间:2023-11-01 11:44:06 26 4
gpt4 key购买 nike

我有一个包含 5 个项目的 Visual Studio 解决方案

  • 主要:应用
  • A、B、C、D:静态库

主要取决于A,B。 A 依赖于 C,D。

我对构建过程的理解很脆弱。

库单独构建良好,尤其是 A;我不觉得我在将 C 和 D 链接到 A。

为了构建 Main 应用程序,我必须将 A、B、C 和 D 作为输入库,即使 Main 仅直接依赖于 A、B。

现在我正尝试在 Linux 上使用 CMake 构建整个东西,我发现自己再次接触到这些链接。这次我不想使用蛮力,而是更愿意了解它是如何链接在一起的。

我是否应该将 A、B、C 和 D 构建为 .a 静态库并让 Main 包含它们?

如果没有来自 C 和 D 的符号,A 怎么可能构建?

最佳答案

静态库仅仅是包含目标文件的文件(即单独编译的源文件)。因此,在构建静态库时,您不会“链接”它,而是“归档”它。

链接可执行文件或共享库时必须解析符号。此时链接器会尝试解析所有符号,如果不能解析,则会出现 undefined reference 错误。但是,这又与链接有关。静态库不需要在其中定义所有符号。

在您的情况下,如果 ABCD 是静态库,它们将是彼此独立 build 。从 CD 构建 A 所需的唯一东西是编译器需要的头文件。

当您构建可执行文件时,您需要指定所有静态库,即使 Main 没有“直接”引用来自 CD 的符号

现在,即使静态库不能隐式依赖于其他库,CMake 也提供了一种在构建系统级别表达这种依赖性的方法。您可以执行以下操作

add_library(C STATIC ${B_SOURCES})
add_library(D STATIC ${D_SOURCES})

add_library(A STATIC ${A_SOURCES})
target_link_libraries(A PUBLIC C D)
上面的

target_link_libraries 命令不会导致 ACD 链接 - 如我所写,那没有静态库工作。相反,它通知 CMake 在将可执行文件与 A 链接时,它还必须将其与 CD 链接:

add_executable(Main ${MAIN_SOURCES})
target_link_libraries(Main PRIVATE A)

即使 target_link_libraries 只包含 A,CMake 生成的 Makefile 也会链接 CD - 因为它们被指定为 A 的依赖项。


dllexport 和 dllimport

这两个属性仅适用于共享库 (DLL)。它们控制从 DLL 导出哪些符号(即可以从链接到该 DLL 的可执行文件访问)。 Here's a link描述 Linux 上的想法和等效内容。

关于C++ 构建过程 - lib 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50611405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com