参考说明
https://blog.zllcrm.org/2023/07/25/%E8%BD%BB%E6%9D%BE%E6%90%AD%E5%BB%BAUbuntu20.04%E8%99%9A%E6%8B%9F%E6%9C%BA+ROS2%E5%B9%B3%E5%8F%B0/
CMake使用文档
引言
本文旨在提供一个关于使用CMake进行项目构建的全面指南。文中将包括从环境搭建到高级配置的各个方面。
一、环境搭建
安装CMake
在Windows上,你可以从CMake的官方网站下载安装包。
在Linux上,使用包管理器进行安装,例如:sudo apt-get install cmake。
在macOS上,你可以使用Homebrew:brew install cmake。
验证安装
打开终端,输入 cmake --version,如果看到版本信息,则安装成功。
二、简单入门
2.1 项目结构
一个简单的CMake项目结构可能如下:
Copy code
MyProject/
|-- CMakeLists.txt
|-- main.cpp
2.2 示例源码
在CMakeLists.txt文件中:
Copy code
cmake_minimum_required(VERSION 3.10)
project(MyProject)
add_executable(MyProject main.cpp)
在main.cpp中:
Copy code
#include
int main() {
std::cout << “Hello, World!” << std::endl;
return 0;
}
2.3 运行查看
在终端中运行以下命令:
Copy code
mkdir build
cd build
cmake …
make
./MyProject
输出应该是 “Hello, World!”。
三、编译多个源文件
3.1 在同一个目录下有多个源文件
3.1.1 简单版本
3.1.1.1 项目结构
Copy code
MyProject/
|-- CMakeLists.txt
|-- main.cpp
|-- function.cpp
|-- function.h
3.1.1.2 示例代码
在CMakeLists.txt中:
Copy code
add_executable(MyProject main.cpp function.cpp)
3.1.1.3 运行查看
运行与第二节相同的构建和执行命令。
3.1.2 进阶版本
3.1.2.1 项目结构
与3.1.1.1相同。
3.1.2.2 示例源码
在CMakeLists.txt中:
Copy code
set(SOURCES main.cpp function.cpp)
add_executable(MyProject ${SOURCES})
3.1.2.3 运行查看
与3.1.1.3相同。
3.2 在不同目录下有多个源文件
3.2.1 项目结构
Copy code
MyProject/
|-- CMakeLists.txt
|-- main/
| |-- main.cpp
|-- function/
|-- function.cpp
|-- function.h
3.2.2 示例源码
在CMakeLists.txt中:
Copy code
add_executable(MyProject main/main.cpp function/function.cpp)
3.2.3 运行查看
与第二节相同的构建和执行命令。
四、项目级的组织结构
4.1 项目结构
在更大的项目中,你可能希望将代码分割为多个子目录。一个典型的项目结构可能如下:
Copy code
MyProject/
|-- CMakeLists.txt
|-- src/
| |-- main.cpp
|-- include/
| |-- MyHeader.h
|-- lib/
| |-- CMakeLists.txt
| |-- libsource.cpp
4.2 示例源码
在根目录下的CMakeLists.txt:
Copy code
cmake_minimum_required(VERSION 3.10)
project(MyProject)
add_subdirectory(lib)
include_directories(include)
add_executable(MyProject src/main.cpp)
target_link_libraries(MyProject MyLibrary)
在lib/CMakeLists.txt:
Copy code
add_library(MyLibrary libsource.cpp)
4.3 运行查看
与之前相似,构建和执行的命令也应该和之前一样。
五、动态库和静态库的编译控制
5.1 生成库文件
5.1.1 项目结构
类似于4.1节中描述的结构。
5.1.2 示例源码
要生成动态库,你可以在CMakeLists.txt中这样设置:
Copy code
add_library(MyDynamicLibrary SHARED libsource.cpp)
生成静态库:
Copy code
add_library(MyStaticLibrary STATIC libsource.cpp)
5.1.3 运行查看
你可以运行构建命令生成库文件,并通过指定库路径来链接它。
5.2 链接库文件
5.2.1 项目结构
与5.1.1相同。
5.2.2 示例源码
在CMakeLists.txt:
Copy code
target_link_libraries(MyProject MyDynamicLibrary)
或
Copy code
target_link_libraries(MyProject MyStaticLibrary)
5.2.3 运行查看
生成可执行文件后,你可能需要设置动态链接库路径来运行它。
六、条件编译
6.1 简单程序
6.1.1 项目结构
Copy code
MyProject/
|-- CMakeLists.txt
|-- main.cpp
6.1.2 示例代码
在CMakeLists.txt:
Copy code
option(USE_MY_OPTION “Use my custom option” ON)
if(USE_MY_OPTION)
add_definitions(-DUSE_MY_OPTION)
endif()
在main.cpp:
Copy code
#ifdef USE_MY_OPTION
// Some code
#endif
6.1.3 运行查看
与之前一样。
6.2 添加编译选项
6.2.1 生成部分指定bin或库文件
6.2.1.1 项目结构
与6.1.1相同。
6.2.1.2 示例源码
在CMakeLists.txt:
Copy code
if(USE_ANOTHER_OPTION)
add_executable(MyAnotherProject another_main.cpp)
endif()
6.2.1.3 运行查看
可以通过 -DUSE_ANOTHER_OPTION=ON 来指定编译选项。
6.2.2 编译部分代码
在CMakeLists.txt:
Copy code
if(USE_PARTIAL_CODE)
set(SOURCES main_partial.cpp)
else()
set(SOURCES main.cpp)
endif()
add_executable(MyProject ${SOURCES})
这样,就可以根据条件来编译不同的源文件了。