add_library()
add_library()
是用来添加一个库文件(静态库或动态库)的函数。它的作用是将一个或多个库文件添加到项目中,以供编译链接时使用。
语法如下
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL]
source1 [source2 ...])
name
表示库文件的名称,可以包含路径信息;STATIC
、SHARED
和MODULE
表示库文件的类型,分别表示静态库、动态库和可加载模块;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
操作:
- 定义列表
可以使用set()
命令来定义一个列表变量,例如:
set(LIST_VAR "item1" "item2" "item3")
这样就定义了一个名为 LIST_VAR
的字符串列表变量,包含三个元素:item1
、item2
和 item3
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
:使用当前编译器所在的处理器架构进行编译,以达到最佳的性能表现。