首页 > 编程语言 >CMake编译不同文件目录下的C++文件

CMake编译不同文件目录下的C++文件

时间:2024-08-22 21:52:24浏览次数:11  
标签:src CMake sum C++ cpp test 文件目录 include 目录

        由于我们构建一个项目的时候,通常不会将所有的源文件放在一个文件目录下,这样既不方便开发,也不方便源码阅读,我们通常会对项目文件进行分层,比如分为includesrcreslib这些目录,src下又分为modelcontrollerview这些目录。所以跨文件编译C++文件就相当必要了,如果使用g++指令将这些文件统一进行编译,指令就太冗长了,就算将这些指令写成一个shell脚本,每次要添加新的目录的时候,又要对这个shell脚本进行修改,非常麻烦。Makefile可以很好解决这个问题,但是Makefile的书写还是太过复杂了,因此我们可以使用Makefile的升级版,也就是CMake来解决这一问题。

        假如我们有一个test4文件夹。文件目录如右图树状图所示。

 main.cpp

#include<iostream>
#include"test/test.h"
using namespace std;
int main()
{
	test();
	return 0;
}

test.h

#ifndef TEST_HEADER
#define TEST_HEADER
void test();
#endif

 test.cpp

#include"test.h"
#include<iostream>
void test()
{
    std::cout<<"hello world"<<std::endl;
}

 test4目录下的CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.0)
project(MyProject)

# 添加子目录
add_subdirectory(test)
# 生成可执行文件
add_executable(myapp main.cpp)

# 链接test目录下生成的动态库或者静态库
target_link_libraries(myapp test)

 test目录下的CMakeLists.txt文件如下:

# 设置库文件
aux_source_directory(. LIB_SRCS) 
add_library(test STATIC ${LIB_SRCS})

        实际上CMake编译不同文件目录下C++文件的原理就是将各个目录C++文件做成链接库,然后在主目录的main.cpp下引用这些库。

        我们在test4目录下创建一个build文件,用来存放CMake构建产生的中间文件。

mkdir build
cd build
cmake ..

make

./myapp

成功运行。

 

        假如我在test目录下再创建一个sum目录呢,并且将test目录的test.h和sum.h都放到include目录下呢,剩余的.cpp文件都放在src目录下。

main.cpp代码如下,其实就是加了一个mysum函数,用来求和,就不展示sum.cpp的源码了。

#include<iostream>
#include"../include/test/test.h"
#include"../include/sum/sum.h"
using namespace std;
int main()
{
	test();
	cout<<mysum(1,2)<<endl;
	return 0;
}

        整个目录树变为下面这种形式的。

.
├── build
├── CMakeLists.txt
├── include
│   ├── sum
│   │   └── sum.h
│   └── test
│       └── test.h
└── src
    ├── CMakeLists.txt
    ├── main.cpp
    └── test
        ├── CMakeLists.txt
        ├── sum
        │   ├── CMakeLists.txt
        │   └── sum.cpp
        └── test.cpp

         根目录的CMakeLists.txt就变为了这样,这里需要指定可执行文件生成的目录在build下,不然默认就是生成在build/src目录下了,不方便我们执行。

cmake_minimum_required(VERSION 3.0)
project(MyProject)

# 设置编译输出目录
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/build)
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
# 包含src目录
add_subdirectory(src)

src目录下的CMake文件如下:

cmake_minimum_required(VERSION 3.0)
project(MyProject)

# 添加子目录
add_subdirectory(test)
add_subdirectory(test/sum)  # 添加sum子目录

# 生成可执行文件
add_executable(myapp main.cpp)

# 链接test库
target_link_libraries(myapp test)

src/test目录下的CMake文件如下

# 设置库文件
aux_source_directory(. LIB_SRCS) 
add_library(test STATIC ${LIB_SRCS})
# 链接sum库
target_link_libraries(test sum)

src/test/sum目录下的CMake文件如下

# 设置库文件
aux_source_directory(. LIB_SRCS) 
add_library(sum STATIC ${LIB_SRCS})

编译项目。 

cd build
cmake ..
make

可执行文件myapp直接生成在了build目录下。 

 

成功执行。 

 

标签:src,CMake,sum,C++,cpp,test,文件目录,include,目录
From: https://blog.csdn.net/weixin_74027669/article/details/141354142

相关文章

  • C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)
    饿汉单例模式        程序还没有主动获取实例对象,该对象就产生了,也就是程序刚开始运行,这个对象就已经初始化了。 classSingleton{public: ~Singleton() { std::cout<<"~Singleton()"<<std::endl; } staticSingleton*get_instance() { return&sin......
  • 【C/C++ 软件开发模拟面试 集】cmake 相关知识点模拟面试
    摘自:https://zhuanlan.zhihu.com/p/662623216第一轮:基础知识 1.1什么是CMake? 面试官: 请问你能简单描述一下CMake是什么,以及它通常用来做什么吗? 面试者: CMake是一个跨平台的自动化构建系统,主要用来管理软件构建的过程,它使用一个名为CMakeLists.txt的配置文件来指导编......
  • c++矩阵旋转问题
    问题有一个MxN的矩阵,设计函数将其顺时针旋转90度。打印示例Originalmatrix:123456789Rotatedmatrix(90degreesclockwise):741852963代码#include<iostream>#include<vector>usingnamespacestd;voidrotateMatrix90Clockwise(constv......
  • C++—八股文总结(25秋招期间一直更新)
    1、const1.1指针常量和常量指针说说constint*a,intconst*a,constinta,int*consta,constint*consta分别是什么,有什么特点。constint*a==intconst*a; //可以通过a访问整数值,但不能通过a修改该整数的值,指针本身是可变的,可以指向不同的整数constint......
  • 从零开始学习C++之if判断语句
    当你想判断某个条件时,怎么办呢?当当当当(日常发疯),if语句就派上用场了。使用方法不多废话,使用格式如下:if(条件){ 代码}elseif(条件){ 代码}else{ 代码}注:elseif/else可以没有。这几个条件中只能满足一个。例:if(n==1){ cout<<1;}elseif(n==1)......
  • C/C++语言基础--指针三大专题详解3,完结篇(包括指针做函数参数,函数指针,回调函数,左右法
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言指针是C/C++的灵魂,和内存地址相关联,运行的时候速度快,但是同时也有很多细节和规范要注意的,毕竟内存泄漏是很恐怖的指针打算分三篇文章进行讲解,本专题是三,完结篇,介绍了指针做函数参数,函数指针,回调函数,左右法则解决复......
  • C++好用的特性以及STL
    C++中基于范围的for循环程序的基本结构包括三种:顺序结构,选择结构(也称分支结构)和循环结构(也称程序的基本控制结构包括三种:顺序结构、选择结重复结构)。循环结构的实现方法比较多,除了使用while()、dowhile()和for()循环之外,C++11还提供了一种称为基于范围(Rane-based)的fo......
  • 从零开始学习C++之变量
    变量没啥好讲的,讲下类型和格式得了。变量类型:int:整数类型;范围大约为\(-2147000000\sim2147000000\)。longlong:长整型;范围大约是\(-2^{63}\sim2^{63}-1\)。unsignedint/longlong:不包括负数,整数范围扩大一倍。double:小数类型(比float进度高),大约能包含\(1......
  • C++异常处理详解
    目录一、异常处理的基本概念1.1例外类型1.2异常处理流程二、C++异常处理的语法2.1抛出异常2.2捕获异常三、示例代码示例:简单的除法操作3.1代码解析四、注意事项五、小结        异常处理是程序的一种控制结构,用于处理在程序执行期间可能出现的错误......
  • 从零开始学习C++之循环
    本文讲解C++中循环的使用。C++中较常用的两种循环为for循环和while循环。for循环for循环主要用于实现两个区间中间的枚举。例如:从\(1\sim100\)中输出所有数就能使用for循环解决。这是for循环标准格式:/*for(变量类型变量名=左区间;循环退出条件(如:i<=......