add_library()

add_library() 是用来添加一个库文件(静态库或动态库)的函数。它的作用是将一个或多个库文件添加到项目中,以供编译链接时使用。
语法如下

add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL]
    source1 [source2 ...])
  • name表示库文件的名称,可以包含路径信息;
  • STATICSHAREDMODULE 表示库文件的类型,分别表示静态库、动态库和可加载模块;
  • EXCLUDE_FROM_ALL 表示该库不会被默认构建,需要手动指定构建。

add_library() 中,我们可以指定一个或多个库文件的源文件,这些源文件可以是编译后的二进制文件(例如 .o 文件),也可以是源代码文件。CMake 会自动根据库文件的类型(STATIC、SHARED 或 MODULE)来选择正确的编译方式。

例如,以下代码定义了一个名为 mylib 的静态库文件:

add_library(mylib STATIC mylib.cpp)

这将编译 mylib.cpp 文件,并生成一个名为 libmylib.a 的静态库文件。在项目中链接该库时,可以使用 target_link_libraries() 函数将其链接到目标可执行文件或其他库文件中。

target_link_libraries()

在 CMake 中,target_link_libraries() 函数用于将一个或多个库文件链接到目标可执行文件或库文件中。它的作用是将库文件与目标文件进行链接,使得目标文件可以使用库文件中定义的函数和变量。
使用 target_link_libraries() 函数将库文件链接到目标中的语法如下:

target_link_libraries(<target> [PRIVATE | PUBLIC | INTERFACE]
    <library> [<library2> ...])
  • 其中,target 表示要链接库文件的目标文件(可执行文件或库文件);
  • PRIVATE 表示链接库文件时只在当前目标中使用;
  • PUBLIC 链接库文件时既在当前目标中使用也在该目标的依赖目标中使用,链接属性默认为 PUBLIC;
  • INTERFACE 仅在该目标的依赖目标中使用;
  • library 表示要链接的库文件的名称

例如:以下代码将 mylib 静态库文件链接到 myapp 可执行文件中:

add_executable(myapp main.cpp)
add_library(mylib STATIC mylib.cpp)
target_link_libraries(myapp mylib)

例如:将 PCL 库文件链接到 CMake 项目中的目标 ${PROJECT_NAME}

target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES})

list用法

CMake 中,list 类型是一个非常常用的变量类型,可以用来保存一个字符串列表。CMake 中的列表和数组类似,可以使用索引和循环来访问和操作其中的元素。
以下是一些常用的 CMake 中的 list 操作:

  1. 定义列表
    可以使用 set()命令来定义一个列表变量,例如:
set(LIST_VAR "item1" "item2" "item3")

这样就定义了一个名为 LIST_VAR 的字符串列表变量,包含三个元素:item1item2item3
2. 访问列表元素
使用 ${LIST_VAR} 可以获取整个列表,使用 ${LIST_VAR} 下标可以获取列表中的某个元素。例如,${LIST_VAR} 返回整个列表,${LIST_VAR[0]} 返回列表的第一个元素,${LIST_VAR[1]} 返回列表的第二个元素,以此类推。
3. 列表操作

CMake 中提供了许多列表操作的命令,包括:

  • list(LENGTH LIST_VAR len): 获取列表的长度,保存到变量 len 中。
  • list(APPEND LIST_VAR item1 item2 ...): 向列表 LIST_VAR 的末尾添加元素。
  • list(INSERT LIST_VAR indexitem1 item2 ...): 在列表 LIST_VAR 的指定位置 index 插入元
  • list(REMOVE_ITEMLIST_VAR item): 从列表 LIST_VAR 中删除元素 item。
  • list(REMOVE_DUPLICATESLIST_VAR): 删除列表 LIST_VAR 中的重复元素。
  • list(SORT LIST_VAR): 对列表 LIST_VAR进行排序。

orb-slam2中的一个例子

LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)

向 CMake 的模块搜索路径中添加一个新的目录,它将 ${PROJECT_SOURCE_DIR}/cmake_modules 目录添加到 CMake 的 CMAKE_MODULE_PATH 变量中。
其中${PROJECT_SOURCE_DIR} 是一个 CMake 变量,它表示当前 CMake 项目的顶级源代码目录也就是调用 CMake 的命令所在的目录,也就是 CMakeLists.txt 所在的目录。

file()用法

CMake中的file()命令是用于操作文件和目录的命令,主要用于文件操作和路径操作。
下面是一些常见的file()命令用法:
file(GLOB var RELATIVE path globbing expressions):

  • 用于将一个或多个符合指定globbing表达式的文件或目录匹配到一个变量var中。
  • 可以使用双引号或单引号括起来的globbing表达式。其中,*表示匹配任意字符,?表示匹配单个字符,[...]表示匹配指定字符集中的任意一个字符。
  • RELATIVE path表示相对路径,指定搜索路径的相对路径。
    例如orb-slam2中CMakeLists.txt中
file(GLOB sources "*.cpp")

file(GLOB sources "*.cpp")会在当前目录中搜索所有以.cpp为扩展名的文件,并将它们的路径存储到一个变量sources中。这个变量sources可以在后续的CMake命令中使用,比如用来编译生成可执行文件或库文件。
需要注意的是,file()命令中的变量名不能与CMake内置变量重名。另外,使用file()命令时应该避免使用通配符,因为通配符的展开可能会因不同平台而不同。

常见操作

常见变量

CMAKE_BUILD_TYPE:该变量用于指定构建类型。比如Debug表示调试模式,包含调试信息和禁用优化;Release表示发布模式,包含优化和禁用调试信息等。默认值为空。可以在CMakeLists.txt中通过set()命令设置该变量的值,例如:

set(CMAKE_BUILD_TYPE Release)

CMAKE_CXX_FLAGS:该变量用于指定C++编译器的编译选项。例如,可以通过设置该变量来开启C++11标准支持,启用警告选项等。可以在CMakeLists.txt中通过set()命令设置该变量的值,例如:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")

CMAKE_LIBRARY_OUTPUT_DIRECTORY:该变量用于指定库文件生成的目录。可以在CMakeLists.txt中通过set()命令设置该变量的值,例如:

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)

CMAKE_RUNTIME_OUTPUT_DIRECTORY:该变量用于指定可执行文件生成的目录。可以在CMakeLists.txt中通过set()命令设置该变量的值,例如:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/RGB-D)

设置编译选项

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native")

设置c和c++的编译选项
具体参数解释如下:

  • Wall:开启所有警告信息。
  • O3:开启最高级别的优化,使程序运行速度更快。不过需要注意的是,过高的优化级别可能会影响代码可读性和可维护性。
  • march=native:使用当前编译器所在的处理器架构进行编译,以达到最佳的性能表现。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐