cmake 多目录管理

1准备工作

本实验主要在windows 下实现cmake 构建。下载安装camke 和 MinGW。通过命令 camke --version 和 mingw32-make --version(我的是32位计算机)来验证cmake 和 MinGW是否安装成功,如下图所示。如果不成功,很有可能是有关cmake或者 mingw没有设置到计算系统环境变量中。

2、camke多目录实践

目录如下:

bin文件夹:用于存储最终生成的程序

build文件夹:用于存储构建过程中的过程文件

math、src、test0,test1文件夹:等用来存储程序文件.c .h。

main文件:用来存储程序入口main.c

代码如下:

main.c

#include <stdio.h>
#include <stdlib.h>

#include "MathFunctions.h"

#include "test0.h"
#include "test1.h"

int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
	test0();
	test1();
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

MathFunctions.c  幂运算

#include <stdio.h>
#include <stdlib.h>

/**
 * power - Calculate the power of number.
 * @param base: Base value.
 * @param exponent: Exponent value.
 *
 * @return base raised to the power exponent.
 */
double power(double base, int exponent)
{
    int result = base;
    int i;
    
    if (exponent == 0) {
        return 1;
    }
    
    for(i = 1; i < exponent; ++i){
        result = result * base;
    }

    return result;
}

MathFunctions.h  

#ifndef MATH_FUNCTION
#define MATH_FUNCTION

extern double power(double base, int exponent);


#endif

test0.c

#include <stdio.h>
void test0()
{
	printf("test0 is ok\r\n");
}

test0.h

#ifndef TEST_0
#define TEST_0

void test0();

#endif

test1.c

#include <stdio.h>
void test1()
{
	printf("test1 is ok\r\n");
}

test1.h

#ifndef TEST_1
#define TEST_1

void test1();

#endif

CMakeLists.txt

#CMake 最低版本要求
cmake_minimum_required(VERSION 3.18)

INCLUDE(CMakeForceCompiler) 
CMAKE_FORCE_C_COMPILER(gcc GNU)
CMAKE_FORCE_CXX_COMPILER(g++ GNU)

#设置C编译器
set(CMAKE_C_COMPILER "gcc")


#设置C++编译器
set(CMAKE_CXX_COMPILER "g++")

# 项目信息
project(Demo2)

# 添加 头文件目录
set(INCLUDE_DIR 
    ./math
	./src/test0
	./src/test1)

#添加源文件目录	  
file(GLOB ALL_SOURCE
    ./main/*.h
	./main/*.c
	./math/*.c
    ./math/*.h
	./src/test0/*.c
	./src/test0/*.h
	./src/test1/*.c
	./src/test1/*.h
     )

#指定生成目标文件夹	 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin")

#指定包含目录
include_directories(${INCLUDE_DIR})

#指定生成目标
add_executable(Demo ${ALL_SOURCE})

这里是本文的重点:

set(INCLUDE_DIR ....) ,将需要的头文件目录放入INCLUDE_DIR变量中,可以根据程序需要修改目录。

file(GLOB ALL_SOURCE ...)将需要编译的源文件和头文件放入ALL_SOURCE 变量中,可以根据程序需要修改目录。

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin")指定目标生成文件的目录。


include_directories(${INCLUDE_DIR})  包含INCLUDE_DIR变量中的目录
add_executable(Demo ${ALL_SOURCE}) 通过ALL_SOURCE中的源文件生成目标文件。

从上面可以看出,如果需要定制自己文件目录只需要修改INCLUDE_DIR ALL_SOURCE的配置即可,从而实现多个目录甚至多层目录的管理。

 

3 运行

进入build文件,开启cmd窗口,cmake -G "MinGW Makefiles" ..  。注意是两个点,这里表示在build文件中运行上一层目录中的CmakeLists.txt文件。这样运行cmake,过程文件都会生成在build文件夹中,不会污染原来的工程文件,这个叫做cmake的外部编译。如下图所示,cmake构建成功。

 

接着输入mingw32-make,如下图所示,编译完成。

切换目录到bin下,输入 demo.exe  5  2。如下图所示结果,程序运行正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值