如何使用 cmake 正确链接库?

Posted

技术标签:

【中文标题】如何使用 cmake 正确链接库?【英文标题】:How do I link the library correctly using cmake? 【发布时间】:2020-09-04 07:45:43 【问题描述】:

我已经在下面列出了我的项目目录,所以当我进行 cmake build 时,我得到了一个我无法弄清楚的链接器错误。我收到一个无法找到 LIBD 的链接器错误,尽管 LIBB 已成功形成并且 APP 可执行文件只需要 LIBB 为什么在尝试构建 APP 时会抛出需要 LIBD 的链接器错误?

|---CMakeLists.txt <==== add_subdirectory(source) , add_subdirectory(apps)

|---build

|---include
    |---a.h
    |---b.h

|---apps|   
    |---CMakeLists.txt
    |---apps.cpp              1] target_link_libraries(APP PUBLIC LIBB)   <==== linker error 
                                                                                 LIBD not found
  
|---source
|   |---CMakeLists.txt  ===>  1]link_directories(PATH TO LIBD)
                              2]target_link_libraries(LIBA public LIBC) <== successful
                              3]target_link_libraries (LIBB public LIBA LIBD) <== successful

    |---a.cpp
    |---b.cpp

|---lib
|   |---LIBD    <===== static library 

【问题讨论】:

这很令人困惑。 LIBD 目标在哪里定义?在您发出target_link_libraries 电话时,它是否在范围内? @Botje LIBD 是一个静态库 add_library(a.cpp b.cpp $LIBD ) @AdabH 我需要 LIBA 和 LIBB 而不是源文件 【参考方案1】:

link_directories 的范围是包含它的文件,在您的情况下为 source/CMakeLists.txt,因此 apps/CMakeLists.txt 不知道在哪里可以找到 LIBD。

您应该在主 CMakeLists.txt 中创建一个 IMPORTED CMake 目标,并链接到您需要它的位置:

add_library(LIBD IMPORTED)
set_target_properties(LIBD PROPERTIES
    IMPORTED_LOCATION lib/LIBD.a)

或者,您也可以在 apps/CMakeLists.txt 中重复 link_directories 语句。

【讨论】:

我会尝试你的建议,但是我有一个问题要问你,LIBB已经成功构建,而APP只是依赖于LIBB,为什么抱怨找不到LIBD。我的意思是不是 LIBB 独立静态库。 是的,我读到了那个botje,对不起,如果我不明白,为什么 apps/CMakeLists.txt 需要找到 LIBD ,当它只依赖于 LIBB 时,我错过了什么吗? 将 LIBD 添加到 LIBB 的 PUBLIC 接口使其成为传递依赖。如果您不想这样做,请将其链接为 PRIVATE。 嗨 Botje,将 PUBLIC 设为 PRIVATE 并没有帮助,但按照您的建议对主要的 CMakeLists.txt 进行了更改。

以上是关于如何使用 cmake 正确链接库?的主要内容,如果未能解决你的问题,请参考以下文章

使用 cmake 正确链接库

如何正确地将库与 cmake 链接?

如何在 CMake 中正确创建目标之间的依赖关系?

CMake项目结构:如何正确地将库合并在一起并将它们包含在多个可执行文件中

使用 cmake 如何静态链接一些库和动态链接其他库?

如何使用 CMake 链接库?