使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译 时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。
cmake安装
ubuntu上直接执行 sudo apt install cmake 安装完成,可以通过cmake --version查看其版本:
user@ubuntu:~$ cmake --version
cmake version 3.10.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
cmake使用
一个大型项目中,通常代码组织如下:
user@ubuntu:~/CMakeTest$ tree
.
├── bin
├── build
├── CMakeLists.txt
├── include
│ └── sum.h
├── lib
├── src
│ ├── CMakeLists.txt
│ └── sum.cpp
└── test
├── CMakeLists.txt
└── main.cpp
最外层的 CMakeLists.txt 是总控制编译,内容如下:
# 要求cmake最低的版本号
cmake_minimum_required (VERSION 2.8)
# 定义当前工程名字
project (demo)
# 添加子CMakeLists.txt路径
add_subdirectory(test)
add_subdirectory(src)
src里面的源代码要生成静态库或动态库,CMakeLists.txt内容如下:
# 设置库文件存放路径
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 添加头文件路径,相当于makefile里面的-I
include_directories(${PROJECT_SOURCE_DIR}/include)
# 生成库,动态库是SHARED,静态库是STATIC
ADD_LIBRARY(sum SHARED sum.cpp)
# 修改库的名字
#set_target_properties (sum PROPERITES OUTPUT_NAME "libsum")
test源码会加载并使用libsum.so,里面的CMakeLists.txt内容如下:
# 设置程序可加断点
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)
# 设置cmake的全局变量
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 添加头文件路径,相当于makefile里面的-I
include_directories(${PROJECT_SOURCE_DIR}/include)
# 设置库文件搜索路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 设置可执行文件
add_executable(main main.cpp)
# 执行可执行文件需要依赖的库
target_link_libraries(main sum)
源文件和头文件的内容如下:
//sum.h头文件的内容
#ifndef SUM_H
int add(int a, int b);
#endif
//sum.cpp文件的内容:
#include "sum.h"
int add(int a, int b)
{
return a + b;
}
//main.cpp文件的内容
#include <iostream>
#include "sum.h"
using namespace std;
int main()
{
int sum = add(3, 5);
cout << sum <<endl;
return 0;
}
在build目录下执行cmake ..命令,然后执行make,如下:
user@ubuntu:~/CMakeTest$ cd build && cmake ..
user@ubuntu:~/CMakeTest/build$ make
执行成功之后,发现在 bin/ 目录下有生成的 main,lib/ 目录下有生成的 libsum.so