CMake是一个跨平台的构建工具,它可以生成各种不同平台上的构建文件,例如Makefile或Visual Studio项目文件。以下是一些常用的CMake命令:
1. cmake_minimum_required:指定需要的最小CMake版本。
2. project:定义项目名称和版本号。
3. add_executable/add_library:添加可执行文件或动态/静态库。
4. target_link_libraries:链接库到目标文件中。
5. include_directories:添加头文件路径。
6. link_directories:添加库文件路径。
7. add_definitions:添加编译器定义。
8. set:设置变量的值。
9. if/else/elseif/endif:条件控制语句。
10. foreach:遍历列表。
11. add_custom_command / add_custom_target:自定义构建命令和目标。
12. install:安装生成的文件。
补充:
CMake语法中预设了一些常用变量:
(1)将多个CMake文件联系到一起
在CMake中,可以使用`include`命令将多个CMake文件联系到一起。
例如,假设我们有这样的目录结构:
```
project/
CMakeLists.txt
src/
CMakeLists.txt
main.cpp
libs/
library1/
CMakeLists.txt
src/
foo.cpp
include/
lib1/
foo.h
library2/
CMakeLists.txt
src/
bar.cpp
include/
lib2/
bar.h
```
我们需要在顶级CMake文件中包含所有子CMake文件。我们可以这样做:
```cmake
# Top-level CMakeLists.txt
# Include libraries
add_subdirectory(libs/library1)
add_subdirectory(libs/library2)
# Include source directory
add_subdirectory(src)
```
在每个库和源码目录中,有一个CMakeLists.txt文件来处理该目录中的内容。包含库的CMakeLists.txt看起来像这样:
```cmake
# libs/library1/CMakeLists.txt
# Define library
add_library(library1 src/foo.cpp)
target_include_directories(library1 PUBLIC include)
# Install library
install(TARGETS library1
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
install(DIRECTORY include/ DESTINATION include/lib1)
```
这将定义名为`library1`的库并将其包含路径添加到`PUBLIC`接口中。它还将该库安装到适当的目录,并将`include/lib1`安装到包含所有头文件的目录中。
源码目录的CMakeLists.txt可能如下所示:
```cmake
# src/CMakeLists.txt
# Define executable
add_executable(my_program main.cpp)
# Link libraries
target_link_libraries(my_program library1 library2)
```
这将定义一个可执行文件`my_program`,并将`library1`和`library2`链接到该文件中。
使用`include`命令在顶级CMakeLists.txt中包含所有子CMakeLists.txt文件,将确保所有代码都被正确构建并链接。
(2) CMake链接动态库和静态库
静态库:在CMake中,可以使用`add_library`命令来创建一个静态库,并使用`target_link_libraries`命令将其链接到可执行文件或其他库中。
假设我们有一个名为`my_library`的静态库,我们想将其链接到名为`my_executable`的可执行文件中。我们可以这样做:
```cmake
# CMakeLists.txt
# Define static library
add_library(my_library STATIC
library_source_1.cpp
library_source_2.cpp
)
# Define executable and link libraries
add_executable(my_executable
main.cpp
)
target_link_libraries(my_executable
my_library
)
```
在这个例子中,`add_library`命令创建一个名为`my_library`的静态库,并列出了该库的源文件。`add_executable`命令创建一个名为`my_executable`的可执行文件,并列出了该文件的源文件。`target_link_libraries`命令将`my_library`库链接到`my_executable`可执行文件中。
如果静态库是在不同目录中定义的,可以使用`find_library`命令来查找并链接该库:
```cmake
find_library(MY_LIBRARY my_library PATHS path/to/my/library)
target_link_libraries(my_executable ${MY_LIBRARY})
```
这将在`path/to/my/library`目录中查找名为`my_library`的静态库,并将其链接到`my_executable`可执行文件中。
静态库的链接顺序很重要,因为每个库都可能依赖于其他库。如果静态库A依赖于静态库B,则必须首先将静态库B链接到可执行文件或其他库中,然后再将静态库A链接到其后面。
动态库:
CMake可以使用`target_link_libraries`命令链接动态库。以下是一个将动态库链接到可执行文件中的示例:
```cmake
cmake_minimum_required(VERSION 3.0)
project(my_project)
# 设置可执行文件名称
set(EXECUTABLE_NAME "my_app")
# 设置源文件
set(SOURCE_FILES main.cpp)
# 查找动态库
find_library(MY_LIB my_lib PATHS /path/to/lib)
# 添加可执行文件
add_executable(${EXECUTABLE_NAME} ${SOURCE_FILES})
# 链接动态库
target_link_libraries(${EXECUTABLE_NAME} ${MY_LIB})
```
在这个示例中,`find_library`命令用于查找名为`my_lib`的动态库。`target_link_libraries`命令用于将`my_lib`动态库链接到可执行文件中。