CMake找不到IMPORTED库

时间:2014-05-09 13:14:06

标签: cmake

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

那么为什么我不能将它作为依赖项添加呢?

2 个答案:

答案 0 :(得分:8)

正如Angew上面提到的,导入库的可见性不同,但您可以使用GLOBAL修饰符对其进行扩展。您可以在下一步修改add_library调用

ADD_LIBRARY(avcodec-debug STATIC IMPORTED GLOBAL)

答案 1 :(得分:5)

导入的目标不遵循与非导入目标相同的可见性规则。虽然非导入目标是全局的(可见并且在定义后可从任何位置访问),但导入的目标仅在定义它们的CMakeLists.txt及其下方(在add_subdirectory()中添加的目录中可见)定义CMakeList)。

由于foo在您的案例中是bar的兄弟,因此目标名称avcodec-debugbar/CMakeLists.txt内不可见,因此它被视为普通的库名称。< / p>

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

add_subdirectory(foo)

include(foo/avcodec.cmake)