学习CMake使用

编译过程, 遇到编译选项的时候在单说

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,这个头文件由CMakeconfig.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, 接下来我们就可以运行了. 截图如下

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值