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。如下图所示结果,程序运行正确。