IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【CMake】CMake学习记录 -> 正文阅读

[C++知识库]【CMake】CMake学习记录

我们在编写c或者c++的时候,通常都比较喜欢用IDE工具去开发,然后点击编译以及运行,一键式~但是,其中的编译过程我们就不得而知了!这时候就有小伙伴说!那就用g++进行编译呗!

g++编译如下:

创建一个test.cpp文件,内容如下:

#include <iostream>

int main(int argc, char *argv[])
{
    std::cout << "test!" << std::endl;
    return 0;
}

进行编译!(-o 后面接着输出的名称,也就是可执行文件,如果不写-o的话,默认是a.out)

g++ test.cpp -o test

执行!

./test

这样的话,确实也能进行编译!但是如果多个文件要编译呢?岂不是运行多次g++呢?当然不需要这么复杂!make即可解决!只需编写makefile文件即可实现多个文件编译!那就试下make编译呗!

make编译如下:

我们先创建2个文件,一个main.cpp 存放main函数进行调用,一个test.cpp 编写代码,再加上一个test.h 头文件

test.cpp代码如下:

#ifndef __TEST__H__
#define __TEST__H__

#include <string>
class DEMO
{
    public:
        void MyPrint(std::string output);
};

#endif

?我创建了一个DEMO类,然后里面加入了一个函数。

test.cpp代码如下:

#include "test.h"
#include <iostream>

void DEMO::MyPrint(std::string output)
{
    std::cout << output << std::endl;
}

main.cpp代码如下:

#include "test.h"

int main(int argc, char *argv[])
{
    DEMO my_print;
    my_print.MyPrint("hello world!");
    return 0;
}

然后编写一个makefile文件(这个是重点!

start:
	g++ -o test.o -c test.cpp
	g++ -o main.o -c main.cpp
	g++ -o demo test.o main.o
clean:
	rm -rf test.o main.o

?分析下makefile文件:

start块内容就是我们要编译的内容,分别编译了test.o和main.o文件,然后在将这两个文件编译输出名为demo的文件

clean块的内容是后续要清除中间文件

开始编译:

make

我们可以看到该目录下生成了以下这些:

我们可以将中间文件清除掉,运行:

make clean

这时候我们的中间文件就没啦

运行可执行文件:

./demo

?

但是发现没有?如果工程文件内容特别多的话,岂不是makefile中要一个个都写上,这不整废了!Don't worry!这时候就要请出我们今天的主角,CMake!!!

我们只需编写CmakeLists.txt文件,然后即可一键生成makefile文件,然后再进行编译即可!

创建一个CMakeLists.txt

project(DEMO)

include_directories(${PROJECT_BINARY_DIR})

add_library(test test.cpp)
add_executable(demo main.cpp)

target_link_libraries(demo test)

分析以下CMakeLists.txt文件:

第一行 工程名,其实第一行应该写cmake_minimum_required(VERSION 3.16) 这个是cmake版本声明,不写也没事,只会警告而已,如下:

第二行 包含头文件全局路径,因为我们的头文件都在根目录,因此写${PROJECT_BINARY_DIR} 表示同级目录

第三行 添加依赖库,用test表示test.cpp

第四行 添加可执行文件,最终生成可执行文件为demo

第五行 将可执行文件和依赖库进行连接

开始执行:

cmake .

?瞧这个就多了个警告!(问题不大可以继续运行,追求完美修改下文件)

修改如下:

cmake_minimum_required(VERSION 3.16)
project(DEMO)

include_directories(${PROJECT_BINARY_DIR})

add_library(test test.cpp)
add_executable(demo main.cpp)

target_link_libraries(demo test)

再次运行:

?我们看下多了什么文件

?这时候多了Makefile文件啦!我们在进行make编译

make 

执行可执行文件

./demo

?这样我们就搞定啦!

最后!为了使文件有点工程的样子,如下所示:

(如果tree没反应,就sudo apt install tree)

我们可以看到一个完整的工程包括如图所示,build文件夹存放中间文件,src文件夹存放cpp一些文件

最外部的CMakeLists.txt代码如下:

cmake_minimum_required(VERSION 3.16)
project(DEMO)

add_subdirectory(src bin)

add_subdirectory(src bin)? ?是将src生成的二进制文件放在bin文件夹中

src内的CMakeLists.txt代码如下:

cmake_minimum_required(VERSION 3.16)
project(DEMO)

include_directories(${PROJECT_BINARY_DIR})

add_library(test test.cpp)
add_executable(demo main.cpp)

target_link_libraries(demo test)

我们进入build文件夹中进行cmake

cmake .. 表示编译外部文件,这时候我们就可以看到build文件夹中存放的中间文件

?

这时候我们可以运行下Makefile文件

??

?执行可执行文件!(可执行文件在bin文件夹中)

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 11:50:13  更:2022-04-04 11:56:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:43:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码