foo/CMakeLists.txt中,基于thisthis,我有以下内容

SET (EXTERNAL_LIB_ROOT "../../external_libs/")

ADD_LIBRARY (avcodec-debug STATIC IMPORTED)

SET_PROPERTY (
    TARGET avcodec-debug PROPERTY IMPORTED_LOCATION
    ${EXTERNAL_LIB_ROOT}/libavcodec-0.8.10.a)

bar/CMakeLists.txt中,我有这个:
# old way uses system libraries
#TARGET_LINK_LIBRARIES (bar avformat avcodec avutil)

# new way uses local debug builds
TARGET_LINK_LIBRARIES (bar avformat avcodec-debug avutil)

当我运行make时,我得到
/usr/bin/ld: cannot find -lavcodec-debug

如果我恢复到原来的方式,请进行构建,触摸foo/CMakeLists.txt并进行重新构建,CMake的配置输出表明构建系统正在找到avcodec-debug。

那么为什么不能将其添加为依赖项呢?

最佳答案

导入的目标与未导入的目标没有遵循相同的可见性规则。尽管未导入的目标是全局的(定义后在任何地方都可见并可以访问),但是导入的目标仅在定义它们的CMakeLists.txt中和下方(在此定义的CMakeList中add_subdirectory()添加的目录中)可见。

由于在您的情况下foobar的同级,因此目标名称avcodec-debugbar/CMakeLists.txt内部不可见,因此将其视为普通库名。

通常,最好在您包含的文件中而不是在自己的项目中定义导入的目标。因此,将foo/CMakeLists.txt更改(或提取其中的相关部分)为foo/avcodec.cmake,然后在顶层CMakeList中将其替换

add_subdirectory(foo)


include(foo/avcodec.cmake)

关于CMake找不到导入的库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23565564/

10-13 09:02