跳转到内容
新建笔记

CMake 库目标

在 CMake 中添加库(无论是静态库 .lib 或者动态库 .so/.dll/.dylib)通常涉及到几个步骤,具体取决于库的类型和您希望如何在项目中使用它们。以下是一些常见的方法来添加和链接库:

1)使用 find_package 来查找和配置外部库: 如果您的项目依赖于外部库,您可以使用 find_package 命令来查找并配置这些库。这通常需要库的 CMake 配置文件(Find<PackageName>.cmake)。

find_package(<PackageName> REQUIRED)

如果找到库,find_package 会设置一些变量,您可以使用这些变量来包含库的头文件和链接库。

2)包含库的头文件: 使用 include_directories 命令来添加库的头文件路径,或者使用 target_include_directories 命令针对特定目标添加头文件路径。

include_directories(${<PackageName>_INCLUDE_DIRS})
# 或者
target_include_directories(my_target PRIVATE ${<PackageName>_INCLUDE_DIRS})

3)链接库: 使用 link_directories 命令添加库文件的路径,或者使用 target_link_libraries 命令来链接库。

link_directories(${<PackageName>_LIBRARY_DIRS}) #如 link_directories(D:/program/TensorRT-8.5.1.7/lib)
# 或者
target_link_libraries(my_target PRIVATE ${<PackageName>_LIBRARIES}) # 您需要指定库的确切名称。

4)添加库文件: 如果您已经有了库文件的路径,您可以直接使用 target_link_libraries 命令来链接它们。

target_link_libraries(my_target PRIVATE /path/to/library.lib)

5)使用 add_library 来添加自己的库: 如果您的项目中包含了要构建为库的代码,您可以使用 add_library 命令来创建库。

add_library(my_library STATIC /path/to/source1.cpp /path/to/source2.cpp)

6)使用 install 命令安装库: 如果您想将库安装到系统路径中,可以使用 install 命令。

install(TARGETS my_library DESTINATION lib)

7)使用 export 命令导出库的依赖: 如果您正在创建一个库,并且希望其他项目能够轻松地链接到它,您可以使用 export 命令来导出库的依赖。

export(TARGETS my_library FILE MyLibraryConfig.cmake)

请注意,link_directories 和 include_directories 命令在现代 CMake 项目中通常不推荐使用,因为它们会影响全局状态,可能会引起不可预见的问题。推荐使用 target_link_libraries 和 target_include_directories 命令,因为它们是针对特定目标的,并且可以更好地控制依赖关系。


8)搜索文件

1)aux_source_directory 命令 aux_source_directory 命令用于查找指定目录下的所有源文件,并将这些文件的列表存储到一个变量中。这通常用于当你有大量源文件且不想手动列出每个文件时。

# 命令格式
aux_source_directory(<dir> <variable>)
# - `<dir>`:指定要搜索的目录。
# - `<variable>`:将搜索到的源文件列表存储到该变量。
cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
add_executable(app ${SRC_LIST})

2)file(GLOB …) 命令 file(GLOB ...) 命令用于根据指定的模式搜索文件,并生成一个文件列表。它可以用于搜索当前目录或递归搜索子目录。

# 命令格式
file(GLOB <variable> <globbing-expression>)
file(GLOB_RECURSE <variable> <globbing-expression>)
  • <variable>:将搜索到的文件列表存储到该变量。
  • <globbing-expression>:指定搜索模式,例如 *.cpp 表示搜索所有 .cpp 文件。
cmake_minimum_required(VERSION 3.0)
project(CALC)
# 搜索当前目录的 src 目录下所有的 .cpp 源文件
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#file(GLOB_RECURSE ALL_SOURCES "*.c" "*.cpp")
# 搜索当前目录的 include 目录下所有的 .h 头文件
file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)

注意事项:

  • 使用 GLOB 时,搜索不会递归到子目录。
  • 使用 GLOB_RECURSE 时,会递归搜索所有子目录。
  • 搜索模式可以包含通配符,如 *.cpp 或 *.h。
  • 路径字符串可以使用双引号或不加引号。