CMake基础和命令介绍

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语法中预设了一些常用变量:

  • CMAKE_MAJOR_VERSION:cmake 主版本号;
  • CMAKE_MINOR_VERSION:cmake 次版本号;
  • CMAKE_C_FLAGS:设置 C 编译选项;
  • CMAKE_CXX_FLAGS:设置 C++ 编译选项;
  • PROJECT_SOURCE_DIR:工程的根目录;
  • PROJECT_BINARY_DIR:运行 cmake 命令的目录;
  • CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt 所在路径;
  • CMAKE_CURRENT_BINARY_DIR:目标文件编译目录;
  • EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
  • LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置

(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`动态库链接到可执行文件中。

你可能感兴趣的:(CMake,CMake)