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 多目录管理的主要内容,如果未能解决你的问题,请参考以下文章
windows下使用cmake+mingw配置makefile