在 CMake 中,target_link_libraries 命令用于将一个或多个库链接到特定的目标上,如可执行文件或库。这个命令非常灵活,可以用来指定目标所需的所有依赖项,包括系统库、第三方库以及你自己的其他目标。
基本语法
target_link_libraries(target_name
item1
item2
...
)
- target_name:目标名称,可以是通过 add_executable 或 add_library 定义的可执行文件或库的名称。
- item1, item2, …:可以是以下类型之一:
- 库的名称(普通库):例如 pthread, dl, m 等。
- 变量:指向库路径或名称的变量,例如 ${ARMADILLO_LIBRARIES}。
- 全路径:指定要链接的库的完整路径,例如 /usr/lib/libexample.so。
示例用法
假设你的项目结构如下:
project/
├── CMakeLists.txt
├── src/
│ ├── main.cpp
│ ├── file1.cpp
│ └── file2.cpp
└── lib/
├── libexample.a
└── libanother.so
以下是一个示例 CMakeLists.txt 文件,演示了如何使用 target_link_libraries 将不同类型的库链接到一个名为 MyExecutable 的可执行文件中:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 添加可执行文件
add_executable(MyExecutable
src/main.cpp
src/file1.cpp
src/file2.cpp
)
# 查找并链接 Armadillo 库
find_package(Armadillo REQUIRED)
target_link_libraries(MyExecutable ${ARMADILLO_LIBRARIES})
# 链接系统库 pthread
target_link_libraries(MyExecutable pthread)
# 链接自定义的静态库 libexample.a 和动态库 libanother.so
target_link_libraries(MyExecutable
${CMAKE_SOURCE_DIR}/lib/libexample.a
${CMAKE_SOURCE_DIR}/lib/libanother.so
)
注意事项
库的查找和链接:
- 使用 find_package 命令来查找和配置依赖库,例如 find_package(Armadillo REQUIRED)。
- 使用变量 ${VARIABLE_NAME} 来引用查找到的库路径或名称,例如 ${ARMADILLO_LIBRARIES}。
系统库
可以直接使用库的名称,例如 pthread、dl、m 等,这些通常是系统自带的标准库。自定义库:
如果库不是通过 find_package 找到的,你可以使用全路径来指定要链接的库,例如 ${CMAKE_SOURCE_DIR}/lib/libexample.a。链接顺序:
在链接库时,通常静态库应该放在动态库之前,例如target_link_libraries(MyExecutable lib1 lib2 …)。
通过 target_link_libraries 命令,你可以方便地管理和链接你的项目所需的所有库,使得 CMake 构建系统能够正确地生成可执行文件或库,并确保它们能够正确地链接和运行。