文章目录
- 1. 含义说明
- 2. 示例
- dep/CMakeLists.txt
- mylib/CMakeLists.txt(关键部分)
在 CMake 中,target_link_libraries()函数用于指定目标(如可执行文件或库)的链接依赖。其中可以使用PUBLIC、PRIVATE和INTERFACE三种可见性说明符(visibility specifiers),它们主要在构建库(library)目标时影响依赖的传递行为。下面分别说明其含义,并辅以示例。
1. 含义说明
假设你有一个库MyLib,它依赖于另一个库DepLib,而你的可执行程序MyApp又链接了MyLib。此时:
PRIVATE DepLib
表示DepLib仅在MyLib内部使用,调用者(如MyApp)不需要知道也不应依赖DepLib。DepLib不会传递给链接MyLib的目标。PUBLIC DepLib
表示DepLib既是MyLib的依赖,也是其接口的一部分。调用者(如MyApp)在链接MyLib时会自动继承对DepLib的依赖(包括头文件路径、编译定义等,如果DepLib是通过target_include_directories等设置的)。INTERFACE DepLib
表示DepLib不是MyLib自己需要的,而是提供给使用者的。MyLib本身不链接DepLib,但任何链接MyLib的目标都会继承这个依赖。通常用于头文件库(header-only library)。
注意:这些说明符只对库目标(STATIC/SHARED/OBJECT/INTERFACE)有意义。对于可执行文件(executable),
PUBLIC和INTERFACE行为类似于PRIVATE(因为可执行文件没有“使用者”)。
2. 示例
假设有如下项目结构:
project/ ├── CMakeLists.txt ├── mylib/ │ ├── CMakeLists.txt │ ├── include/mylib.h │ └── src/mylib.cpp ├── dep/ │ ├── CMakeLists.txt │ ├── include/dep.h │ └── src/dep.cpp └── app/ ├── CMakeList.txt └── main.cppdep/CMakeLists.txt
add_library(dep src/dep.cpp) target_include_directories(dep PUBLIC include)mylib/CMakeLists.txt(关键部分)
add_library(mylib src/mylib.cpp) target_include_directories(mylib PUBLIC include) # 情况1:PRIVATE target_link_libraries(mylib PRIVATE dep) # 情况2:PUBLIC # target_link_libraries(mylib PUBLIC dep) # 情况3:INTERFACE(此时 mylib 可能是 header-only) # add_library(mylib INTERFACE) # target_link_libraries(mylib INTERFACE dep)