cmake 多目录管理

Posted 覃隆强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3  
 4 #include "MathFunctions.h"
 5  
 6 #include "test0.h"
 7 #include "test1.h"
 8  
 9 int main(int argc, char *argv[])
10 {
11     if (argc < 3){
12         printf("Usage: %s base exponent \\n", argv[0]);
13         return 1;
14     }
15     test0();
16     test1();
17     double base = atof(argv[1]);
18     int exponent = atoi(argv[2]);
19     double result = power(base, exponent);
20     printf("%g ^ %d is %g\\n", base, exponent, result);
21     return 0;
22 }

 

MathFunctions.c  幂运算

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3  
 4 /**
 5  * power - Calculate the power of number.
 6  * @param base: Base value.
 7  * @param exponent: Exponent value.
 8  *
 9  * @return base raised to the power exponent.
10  */
11 double power(double base, int exponent)
12 {
13     int result = base;
14     int i;
15     
16     if (exponent == 0) {
17         return 1;
18     }
19     
20     for(i = 1; i < exponent; ++i){
21         result = result * base;
22     }
23  
24     return result;
25 }

 

MathFunctions.h  

1 #ifndef MATH_FUNCTION
2 #define MATH_FUNCTION
3  
4 extern double power(double base, int exponent);
5  
6  
7 #endif

 

test0.c

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

 

test0.h

1 #ifndef TEST_0
2 #define TEST_0
3  
4 void test0();
5  
6 #endif

 

test1.c

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

 

test1.h

1 #ifndef TEST_1
2 #define TEST_1
3  
4 void test1();
5  
6 #endif

 

CMakeLists.txt

 1 #CMake 最低版本要求
 2 cmake_minimum_required(VERSION 3.18)
 3  
 4 INCLUDE(CMakeForceCompiler) 
 5 CMAKE_FORCE_C_COMPILER(gcc GNU)
 6 CMAKE_FORCE_CXX_COMPILER(g++ GNU)
 7  
 8 #设置C编译器
 9 set(CMAKE_C_COMPILER "gcc")
10  
11  
12 #设置C++编译器
13 set(CMAKE_CXX_COMPILER "g++")
14  
15 # 项目信息
16 project(Demo2)
17  
18 # 添加 头文件目录
19 set(INCLUDE_DIR 
20     ./math
21     ./src/test0
22     ./src/test1)
23  
24 #添加源文件目录      
25 file(GLOB ALL_SOURCE
26     ./main/*.h
27     ./main/*.c
28     ./math/*.c
29     ./math/*.h
30     ./src/test0/*.c
31     ./src/test0/*.h
32     ./src/test1/*.c
33     ./src/test1/*.h
34      )
35  
36 #指定生成目标文件夹     
37 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin")
38  
39 #指定包含目录
40 include_directories(${INCLUDE_DIR})
41  
42 #指定生成目标
43 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  (make),如下图所示,编译完成。

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cmake 多目录管理
jordan20052009 2020-07-16 23:07:51  114  收藏 1文章标签: c++ 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);  #endiftest0.c
#include <stdio.h>void test0(){printf("test0 is ok\\r\\n");}test0.h
#ifndef TEST_0#define TEST_0 void test0(); #endiftest1.c
#include <stdio.h>void test1(){printf("test1 is ok\\r\\n");}test1.h
#ifndef TEST_1#define TEST_1 void test1(); #endifCMakeLists.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。如下图所示结果,程序运行正确。

————————————————版权声明:本文为CSDN博主「jordan20052009」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/jordan20052009/article/details/107394851

以上是关于cmake 多目录管理的主要内容,如果未能解决你的问题,请参考以下文章

CMake 多配置生成器使用错误的构建目录

cmake cpp构造项目

windows下使用cmake+mingw配置makefile

简易cmake多文件多目录工程模板

多版本opencv管理;find_package()的原理解析

cmake编译单/多文件