CMake找不到IMPORTED库

spr*_*aff 5 cmake

foo/CMakeLists.txt基于这个这个,我有以下

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

当我跑步时,make我得到了

/usr/bin/ld: cannot find -lavcodec-debug
Run Code Online (Sandbox Code Playgroud)

如果我恢复到老样子,建设,触摸foo/CMakeLists.txt和重建,CMake的的配置输出指示avcodec中调试由编译系统发现.

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

小智 9

正如Angew上面提到的,导入库的可见性不同,但您可以使用GLOBAL修饰符扩展它.您可能已经足够修改下一个方式的add_library调用了

ADD_LIBRARY(avcodec-debug STATIC IMPORTED GLOBAL)


Rei*_*ica 6

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

由于在您的情况下foo是兄弟bar,因此目标名称avcodec-debug在内部不可见bar/CMakeLists.txt,因此它被视为普通库名称.

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

add_subdirectory(foo)
Run Code Online (Sandbox Code Playgroud)

include(foo/avcodec.cmake)
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用显式路径前缀,如`$ {CMAKE_CURRENT_LIST_DIR}`和`$ {CMAKE_CURRENT_SOURCE_DIR}`,而不是依赖于相对路径,尤其是那些以`..`开头的路径. (2认同)
  • 要详细说明@ Angew上面的注释,如果包含的文件使用代码来设置包含文件中使用的变量,例如`set(MY_FILE"../ foobar.c")`,则解释foobar.c的位置相对于包含文件的位置.另一方面,当设置MY_FILE时,`set(MY_FILE"$ {CMAKE_CURRENT_LIST_DIR} /../ foobar.c")`会扩展CMAKE_CURRENT_LIST_DIR的值,所以无论MY_FILE的值在何处使用它都是正确的. (2认同)