在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。那么为什么不能将其添加为依赖项呢?
最佳答案
导入的目标与未导入的目标没有遵循相同的可见性规则。尽管未导入的目标是全局的(定义后在任何地方都可见并可以访问),但是导入的目标仅在定义它们的CMakeLists.txt
中和下方(在此定义的CMakeList中add_subdirectory()
添加的目录中)可见。
由于在您的情况下foo
是bar
的同级,因此目标名称avcodec-debug
在bar/CMakeLists.txt
内部不可见,因此将其视为普通库名。
通常,最好在您包含的文件中而不是在自己的项目中定义导入的目标。因此,将foo/CMakeLists.txt
更改(或提取其中的相关部分)为foo/avcodec.cmake
,然后在顶层CMakeList中将其替换
add_subdirectory(foo)
和
include(foo/avcodec.cmake)
关于CMake找不到导入的库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23565564/