CMake/xmake 简单入门教程
转载
文章目录
建议使用 xmake 简单粗暴。教程:https://xmake.io/#/zh-cn/guide/installation
一、常用变量
下载地址:https://cmake.org/download/ CMake教程:https://cmake.org/cmake/help/v3.17/guide/tutorial/index.html
- 预定义变量
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