如何使用 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 正确链接库?的主要内容,如果未能解决你的问题,请参考以下文章