编译过程, 遇到编译选项的时候在单说
mkdir buidl && cd build && cmake .. && make
./xxx
单文件编译
编写CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(demo)
# 可执行文件的名称
add_executable(main main.c)
同一目录下多文件
在前面CMakeLists.txt基础上做一下修改
aux_source_directory(. DIR_SRCS)
add_executable(main ${DIR_SRCS})
多文件不同目录下
重新编写CMakeLists.txt附带注释, 此时有子目录,在子目录里也增加CMakeLists.txt, 把子目录的文件编译成链接
# 子目录的cmakelists
aux_source_directory(. DIR_LIB_SRCS)
add_library(mmath ${DIR_LIB_SRCS})
# 根目录的cmakelists
cmake_minimum_required(VERSION 2.8)
proejct(demo)
aux_source_directory(. DIR_SRCS)
add_subdirectory(mmath)
include_directories(mmath) #这样在main.c中直接 include"mmath.h"即可, 不用自己找目录了.
add_executable(main ${DIR_SRCS})
target_link_libraries(main mmath) ## link到子目录的链接文件
自定义配置文件
cmake_minimum_required(VERSION 2.8)
project(demo)
configure_file(
# cmake根据config.h.in生成config.h配置文件
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
# 对编译选项的说明, 以及默认值
option(USE_MMATH
"Use provide implementation mmath" ON)
# 开启了USE_MMATH的配置说明
if(USE_MMATH)
include_directories("${PROJECT_SOURCE_DIR}/mmath")
add_subdirectory(mmath)
# 能找到config.h所在的目录, 可以直接include"config.h"
include_directories("${PROJECT_BINARY_DIR}")
set (EXTRA_LIBS ${EXTRA_LIBS} mmath)
endif(USE_MMATH)
aux_source_directory(. DIR_SRCS)
add_executable(main ${DIR_SRCS})
target_link_libraries(main ${EXTRA_LIBS})
文件中configure_file命令用于生成配置头文件config.h,这个头文件由CMake从config.h.in中生成, config.h.in这个文件里面有用户自己定义的编译选项,其中USE_MMATH就是定义在文件config.h.in中,这里使用命令option默认开启这个选项,然后后面的 if 语句根据USE_MMATH变量的值来决定是否使用我们自己的编写的数学函数库,由于USE_MMATH为ON,所以默认是使用我们自己的库.
main.c
#include<stdio.h>
#include<math.h>
#include"config.h"
#ifdef USE_MMATH
#include "mmath.h"
#endif
int main() {
#ifdef USE_MMATH
printf("Use own define pow");
double res = power(2, 6);
printf("Own res: %g", res);
#else
printf("Use standard pow");
double res = pow(2, 6);
printf("Standard res: %g", res);
#endif
return 0;
}
mmath.h
#ifndef MMATH_H
#define MMATH_H
double power(int base, int exp);
#endif
mmath.c
#include"mmath.h"
double power(int base, int exp) {
if (base == 0) {
if(exp > 0) {
return 0;
} else {
return -1;
}
}
int flag = 0, i = 0;
if(exp < 0) {
flag = 1;
}
int res = base;
for(i=1; i<exp; i++){
res *= base;
}
if (flag) {
return 1.0/res;
}
return res*1.0;
}
关于编译选项说明
我们先用cmake生成, 在使用ccmake进行交互式的调整option, 通过上下键选择option, c做保存, g是完成并声称makefile, 接下来我们就可以运行了. 截图如下