cmake target_link_libraries 详解

发布于:2024-06-16 ⋅ 阅读:(119) ⋅ 点赞:(0)

在 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
)

注意事项

  1. 库的查找和链接:

    • 使用 find_package 命令来查找和配置依赖库,例如 find_package(Armadillo REQUIRED)。
    • 使用变量 ${VARIABLE_NAME} 来引用查找到的库路径或名称,例如 ${ARMADILLO_LIBRARIES}。
  2. 系统库
    可以直接使用库的名称,例如 pthread、dl、m 等,这些通常是系统自带的标准库。

  3. 自定义库:
    如果库不是通过 find_package 找到的,你可以使用全路径来指定要链接的库,例如 ${CMAKE_SOURCE_DIR}/lib/libexample.a。

  4. 链接顺序:
    在链接库时,通常静态库应该放在动态库之前,例如target_link_libraries(MyExecutable lib1 lib2 …)。

通过 target_link_libraries 命令,你可以方便地管理和链接你的项目所需的所有库,使得 CMake 构建系统能够正确地生成可执行文件或库,并确保它们能够正确地链接和运行。


网站公告

今日签到

点亮在社区的每一天
去签到