zoukankan      html  css  js  c++  java
  • 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 
    ", 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
    ", 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
    ");
    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
    ");
    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 ", 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 ", 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 ");}test0.h
    #ifndef TEST_0#define TEST_0 void test0(); #endiftest1.c
    #include <stdio.h>void test1(){printf("test1 is ok ");}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

  • 相关阅读:
    【Python】格式化输出json
    【flask】处理表单数据
    【flask】使用Flask-WTF处理表单
    【html】合并单元格,并居中显示文本
    testng失败重跑
    Maven安装以及使用
    使用extentreports美化testng报告2,增加监听
    使用extentreports美化报告
    获取在控制台输入命令后的结果
    mysql的慢查询实战+sql优化
  • 原文地址:https://www.cnblogs.com/qinlongqiang/p/14843559.html
Copyright © 2011-2022 走看看