在foo/CMakeLists.txt
中,根据this和this,我有以下内容
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 。
那么为什么我不能将它作为依赖项添加呢?
答案 0 :(得分:8)
正如Angew上面提到的,导入库的可见性不同,但您可以使用GLOBAL修饰符对其进行扩展。您可以在下一步修改add_library调用
ADD_LIBRARY(avcodec-debug STATIC IMPORTED GLOBAL)
答案 1 :(得分:5)
导入的目标不遵循与非导入目标相同的可见性规则。虽然非导入目标是全局的(可见并且在定义后可从任何位置访问),但导入的目标仅在定义它们的CMakeLists.txt
及其下方(在add_subdirectory()
中添加的目录中可见)定义CMakeList)。
由于foo
在您的案例中是bar
的兄弟,因此目标名称avcodec-debug
在bar/CMakeLists.txt
内不可见,因此它被视为普通的库名称。< / p>
通常首选在您包含的文件中定义导入的目标,而不是在自己的项目中定义。因此,将foo/CMakeLists.txt
更改(或提取相关部分)到foo/avcodec.cmake
,然后在顶级CMakeList中,替换
add_subdirectory(foo)
与
include(foo/avcodec.cmake)