本帖子适用于初学者,StepByStep的入门CMake,CMake也是一门编程语言,只不过是针对编译和链接这种程序构建的过程的语言,学习基本语法就可以初步入门,后面需要什么复杂的功能,进阶掌握需要自己去查找官方文档,后续会给出查阅的一些方式
软件平台
- Win 7
- VMware Workstation 12 Pro
- Ubuntu 15.10
- CMake 3.2.2
case 1
目录结构
+
|
+--- main.cpp
+--- CMakeLists.txt
|
/--+ build/
|
+--- hi
文件内容
//main.cpp
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello CMake!"<<endl;
return 0;
}
//CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(HELLO)
ADD_EXECUTABLE(hi main.cpp)
- mkdir t1
- mkdir build
- vim CMakeLists.txt
- vim main.cpp
- cd build
- cmake ..
- make
即可在build目录下编译出hello可执行文件
语法解释
cmake不区分大小写,建议命令使用大写!
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
设置所写的txt文件,至少需要的cmake版本PROJECT(HELLO)
为本次构建起一个名字,这不是最后exe的名字ADD_EXECUTABLE(hi main.cpp)
添加可执行文件,第一个参数是可执行文件的名字,第二个参数是源文件(暂时只考虑少量源文件,这样可以依次写在后面,后面有命令来批量加入源文件)cmake ..
该命令中..,意味着CMakeLists.txt在上一层目录,这样构建保证了所有构建的文件全部在build文件夹中,方便使用版本控制软件如git进行版本控制,只需要忽略build就可以了
case 2
目录结构
同case1
文件内容
//CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir:" ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir:" ${PROJECT_SOURCE_DIR})
ADD_EXECUTABLE(hi ${SRC_LIST})
#SET_TARGET_PROPERTIES(hi PROPERTIES LINKER_LANGUAGE CXX)
语法解释
SET(VAR_NAME t1.cpp t2.cpp t3.cpp …)
set命令用于设置一个变量SRC_LIST,用来表示后面的所有给出的文件
使用变量需要用如下形式 :${SVAR_NAME},但是如果在IF中使用,则不需要${},直接IF(VAR_NAME)PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量是在PROJECT(HELLO)语句之后cmake默认定义和初始化
其中PROJECT_BINARY_DIR,是输入cmake命令的目录,本例就是build目录
其中PROJECT_SOURCE_DIR,是输入cmake命令后面紧跟着的目录,本例就是..目录,
注:PROJECT_SOURCE_DIR目录里要有CMakeLists.txtMESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)
message命令用于在cmake..时,向命令行输出信息
SEND_ERROR,产生错误信息,跳过生成信息
STATUS,输出前缀为-的信息
FATAL_ERROR,立即终止所有cmake过程SET_TARGET_PROPERTIES(hi PROPERTIES LINKER_LANGUAGE CXX)
SET_TARGET_PROPERTIES设置一些标志,下面的命令设置连接器为C++连接器
注意到,#是cmake的注释符
case 3
目录结构
+
|
+--- CMakeLists.txt
+--- Copyright.txt
+--- ReadME.txt
/--+ src/
|
+--- CMakeLists.txt
/--+ hello/
|
+--- CMakeLists.txt
/--+ src/
|
+--- main.cpp
|
/--+ build/
|
/--+ bin/
|
+--- mycmake
/--+ doc/
|
+--- Userguide.rst
本次依旧使用case2的例子,但是更像一个工程,doc目录存在文档,src目录存放源文件(当然实际工程src目录下可能还有很多子目录,还有一些依赖的外部库等等,这些会后面详细说明),我们控制最后编译链接出的mycmake可执行程序在build的bin目录下
文件内容
// /CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(HELLO)
MESSAGE(STATUS "This is BINARY dir" ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir" ${PROJECT_SOURCE_DIR})
ADD_SUBDIRECTORY(src)
// /src/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_SUBDIRECTORY(hello)
// /src/hello/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin")
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/hello/src HELLO_src)
ADD_EXECUTABLE(mycmake ${HELLO_src})
SET_TARGET_PROPERTIES(mycmake PROPERTIES LINKER_LANGUAGE CXX)
语法解释
ADD_SUBDIRECTORY(src)
添加子目录,子目录要有CMakeLists.txtSET(EXECUTABLE_OUTPUT_PATH “${PROJECT_BINARY_DIR}/bin”)
EXECUTABLE_OUTPUT_PATH是cmake默认变量,修改它可以把可执行文件的路径修改,下面修改为build/binAUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src/hello/src HELLO_src)
AUX_SOURCE_DIRECTORY,自动识别目标目录下的所有源文件,赋值给第二个参数变量,可以直接用于ADD_EXECUTABLE语句