文章目录

建议使用 xmake 简单粗暴。教程:​​https://xmake.io/#/zh-cn/guide/installation​

一、常用变量

下载地址:​​https://cmake.org/download/​​​ CMake教程:​​https://cmake.org/cmake/help/v3.17/guide/tutorial/index.html​

  1. 预定义变量
    PROJECT_SOURCE_DIR   工程的根目录
    PROJECT_BINARY_DIR     运行cmake命令的目录, 通常是​​${PROJECT_SOURCE_DIR}/build​​PROJECT_NAME
    CMAKE_INCLUDE_PATH   环境变量,非cmake变量
    CMAKE_LIBRARY_PATH
    CMAKE_CURRENT_SOURCE_DIR  当前处理的CMakeLists.txt所在的路径
    CMAKE_CURRENT_BINARY_DIR
    CMAKE_CURRENT_LIST_DIR   CMakeLists.txt 的完整路径
    CMAKE_CURRENT_LIST_LINE    当前所在的行
    CMAKE_MODULE_PATH       定义自己的 cmake 模块所在的路径,
    SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后用INCLUDE命令来调用自己的模块
    EXECUTABLE_OUTPUT_PATH    重新定义目标二进制可执行文件的存放位置
    LIBRARY_OUTPUT_PATH
    系统信息
    CAMKE_SYSTEM_NAME 不包含版本的系统名,如Linux
    UNIX :   在所有的类 UNIX 平台下该值为 TRUE,包括 OS X 和 cygwin
    WIN32
    编译控制
    BUILD_SHARED_LIBS    控制默认的库编译方式(默认编译生成静态库)。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,
    CMAKE_C_FLAGS      设置C编译选项
    CMAKE_CXX_FLAGS
    环境变量
    cmake变量使用​​${}​​方式取值,但是在IF控制语句中是直接使用变量名
    ​​$ENV{Name}​​        使用环境变量
    ​​SET(ENV{VAR} VALUE)

二、项目示例

进入项目目录:编译执行:

mkdir build
cd build
cmake ..
make

单文件示例:

文件目录结构

.
// main.cpp
#include <iostream>
#include <stdlib.h>
using namespace std;

double power(double base,double exponent)
{
int res = base;
if(base == 1){
return 1;
}
for(int i=1; i<exponent; i++) {
res = res * base;
}
return res;
}

int main(int argc,char *argv[])
{
if(argc < 3) {
cout << "Usage:" << argv[0] << endl;
return 1;
}
double base = atof(argv[1]);
int exponent= atoi(argv[2]);
cout << "result = " << power(base,exponent) << endl;
return 0;
}
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)     // 版本要求

PROJECT(demo1) //项目名称

ADD_EXECUTABLE(demo1 main.cpp) //生成可执行文件 `demo1`

单目录多文件示例

.
// main.cpp
#include <iostream>
#include <stdlib.h>
#include "./mymath.hpp"
using namespace std;


int main(int argc,char *argv[])
{
if(argc < 3) {
cout << "Usage:" << argv[0] << endl;
return 1;
}
double base = atof(argv[1]);
int exponent= atoi(argv[2]);
cout << "result = " << power(base,exponent) << endl;
return 0;
}
// mymath.hpp
#ifndef MYMATH_H
#define MYMATH_H

double power(double,double);

#endif
// mymath.cpp
#include "./mymath.hpp"
double power(double base,double exponent)
{
int res = base;
if(base == 1){
return 1;
}
for(int i=1; i<exponent; i++) {
res = res * base;
}
return res;
}
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)

PROJECT(demo2)

AUX_SOURCE_DIRECTORY(./ DIR_SRCS) // 将当前文件*.cpp存储在DIR_SRCS中

ADD_EXECUTABLE(demo2 ${DIR_SRCS})

多目录多文件(包含目录)

文件内容与多文件内容一样

.
// 根目录的 CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)

PROJECT(demo3)

ADD_SUBDIRECTORY(./mylib)

AUX_SOURCE_DIRECTORY(./ DIR_SRCS)

ADD_EXECUTABLE(demo3 ${DIR_SRCS})

TARGET_LINK_LIBRARIES(demo3 Mylib) // 链接静态库
// mylib文件夹下的 CMakeLists.txt
aux_source_directory(. DIR_LIB_SRCS)

add_library(Mylib STATIC ${DIR_LIB_SRCS}) // 编译成静态库 Mylib

多目录多文件(标准格式)

.
// 根目录的 CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.10)

PROJECT(demo3)

ADD_SUBDIRECTORY(./mylib)
ADD_SUBDIRECTORY(./src)
// mylib文件夹下的 CMakeLists.txt

AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

ADD_LIBRARY(Mylib STATIC ${DIR_LIB_SRCS})
// src文件夹下的 CMakeLists.txt
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/mylib)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

AUX_SOURCE_DIRECTORY(./ DIR_SRCS)

ADD_EXECUTABLE(demo4 ${DIR_SRCS})

TARGET_LINK_LIBRARIES(demo4 Mylib)

参考:
​​​https://cmake.org/cmake/help/v3.4/manual/cmake-commands.7​