【编译】gcc make cmake Makefile CMakeList.txt 关系、使用

2023-11-19

一 关系

1 gcc是一种编译器。将源代码转为可执行文件。

当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大,所以出现了make工具。

2 make是一个批处理工具。在整个项目中管理编译过程。其依据是makefile文件。

3 makefile是一个文本文件用于指挥make。其中包含一系列规则和命令。make 工具通过读取 makefile 中的规则来确定需要重新编译哪些文件,以及执行哪些命令来完成编译过程。

makefile在一些简单的工程完全可以用人工手写,但是当工程非常大的时候,手写makefile也是非常麻烦的,并且如果换了个平台makefile又要重新修改。这时候就出现了Cmake工具。

4 cmake是一个跨平台构建工具。cmake可以更加简单的生成makefile文件给make用。

5 cmakelist是一个文本文件,用于指挥cmake

image-20230726151254616

参考网址:http://t.csdn.cn/iNMcN



二 gcc

安装

sudo apt update
sudo apt install build-essential gdb

2.1 编译过程

  • 预处理 -E .i 展开宏
  • 编译 -S .s c->汇编
  • 汇编 -c .o 汇编->二进制
  • 链接 -o bin文件

image-20230731165711403

2.2 编译参数

1 -g 带调试信息

2 -O2 优化源代码

3 -l -L 指定库文件 | 指定库文件路径

4 -I 指定头文件搜索目录

5 -Wall 打印警告信息

6 -w 关闭警告信息

7 -std=c++11 设置编译标准

8 -o 指定输出文件名

9 -D 定义宏

image-20230731165958597

image-20230731170020543

image-20230731170034849

2.3 静态库和动态库

1 后缀名
  • 静态库后缀名:.a
  • 动态库后缀名:.so
2 联系与区别
  • 静态库在编译时被链接到目标程序中,成为程序的一部分。优点是可执行文件运行时不依赖外部库。缺点是文件较大。
  • 动态库不会被复制到最终的可执行文件中,节省内存,兼容性问题。

2.4 GDB 调试器

  • 安装

    sudo apt update
    sudo apt install build-essential gdb
    
  • 编译时需要带-g

    gcc -g main.c -o main

1 常用命令

image-20230726212901303

image-20230726212915786

三 make、makefile

四 cmake、cmakelist

4.1 语法特性

image-20230728110412455

4.2 重要命令

# CMake最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)

# 指定工程名为HELLOWORLD
project(HELLOWORLD)

# 定义SRC变量,其值为sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)

# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径
include_directories(/usr/include/myincludefolder ./include)

# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)

# 通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})

# 添加编译参数 -Wall -std=c++11 -O2
add_compile_options(-Wall -std=c++11 -O2)

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

# 将hello动态库文件链接到可执行文件main
target_link_libraries(main hello)

# 添加src子目录,src中需有一个CMakeLists.txt
add_subdirectory(src)

# 定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
    
# 编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC})

image-20230731165308494

image-20230731165343782

image-20230731165410438

4.2 重要变量

image-20230731165534974

image-20230731165553971

4.3 编译流程

  • 1 编写CMakeLists.txt
  • 2 执行命令:cmake 路径,生成makefile
  • 3 执行命令:make

4.4 两种构建方式

image-20230731153412517

五 Vscode

5.0 常用快捷键

快捷键 功能
行注释 ctrl+/
块注释 ctrl+shift+A
移动当前行 alt+上/下
命令面板 ctrl+shift+p
转到文件 ctrl+p
转到行 ctrl+g
打开终端 ctrl+~
变量重命名 F2
打开/关闭侧边栏 ctrl+B
编辑器拆分 ctrl+\
缩略图 菜单栏:查看/外观
代码缩进 ctrl+[/]
代码格式化 ctrl+shift+I
在下方插入一行 ctrl+enter
移到定义处 F12
编辑区放大缩小 ctrl+ -/+

5.1 界面

四大区:菜单栏、侧边栏、编辑区、状态栏

image-20230728095310489

5.2 插件

image-20230731164620130

5.3 .vscode 文件夹

1 launch.json
2 task.json
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【编译】gcc make cmake Makefile CMakeList.txt 关系、使用 的相关文章

  • VS Code 不会构建具有多个 .cpp 源文件的 C++ 程序

    请注意 我在 Ubuntu 17 10 上使用 VS Code 并使用 GCC 编译器 我在构建一个使用附加 cpp 文件的简单程序时遇到问题 我可能在这里遗漏了一些明显的东西 因为我对编程相当陌生 但我会解释到目前为止我所做的事情 这阻止
  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • CMake 占位符如何工作?

    在 CMake 的支持库中 您将看到如下所示的命令定义 set CMAKE ASM ASM DIALECT COMPILE OBJECT
  • 减少内存分配GCC命令

    今天 在我的计算机科学课上 我被告知我可以调整程序在编译期间可以分配的内存量 使用 GCC Linux 该数量默认设置为最佳模式 这意味着尽可能多 在调试应用程序期间 我可以从这个编译器功能中受益匪浅 因为我需要正确处理分配错误 这在我的
  • 在cmake中检测项目语言

    我想检测当前的项目语言 例如 如果我有这样的东西 cmake minimum required VERSION 3 0 project foo VERSION 1 0 LANGUAGES CXX 我需要这样的东西 if project la
  • 如何以编程方式迭代所有 CMake 目标?

    有没有办法从顶层获取 CMake 项目的所有目标CMakeLists txt 即以编程方式迭代目标 我想要这样做的原因是将一些 XCode 特定设置应用于每个目标 if CMAKE GENERATOR MATCHES Xcode inclu
  • _mm256_fmadd_ps 比 _mm256_mul_ps + _mm256_add_ps 慢?

    我有一个图像处理算法来计算a b c d与AVX 伪代码如下 float a new float N float b new float N float c new float N float d new float N assign va
  • cmake 和视觉工作室

    海湾合作委员会 4 4 2 Visual Studio C 2008 我一直在linux上使用cmake 没有任何问题 现在我已经通过应用程序移植到 Windows 上运行 我使用 cmake G Visual Studio 9 2008
  • “const”声明是否有助于编译器(GCC)生成更快的代码? [复制]

    这个问题在这里已经有答案了 Do const声明有助于编译器 GCC 生成更快的代码 还是仅对可读性和正确性有用 泽德 肖认为const在 C C 中无用或过度使用 接下来是对 const 的所有奇怪的迷恋 由于某些奇怪的原因 C 喜欢让你
  • CMake:不要为链接中使用的单个库设置 rpath

    我想要做的是配置我的 CMakeLists 文件 以便在构建我的项目时 链接器使用驻留在我的构建树中的共享库 so 的副本来链接可执行文件 但不会在中设置 rpath链接的可执行文件 以便系统必须在加载程序请求时提供该库 具体来说 我想在构
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • 使用动态链接器包装 glibc 函数

    我正在尝试包装 GLIBCfstat通过将我的库注入可执行文件来实现函数 可以是任何其他 这只是概念证明 我通过将我的库放置在可执行文件的位置来做到这一点RPATH用名字指着libc so 6 我的库的源代码如下 define GNU SO
  • 列出 C 常量/宏

    有没有办法使GNU C 预处理器 cpp 或其他一些工具 列出给定点上的所有可用宏及其值C file 我正在寻找特定于系统的宏 同时移植一个已经精通 UNIX 的程序并加载一堆稀疏的 UNIX 系统文件 只是想知道是否有比寻找定义更简单的方
  • 为什么要在项目中使用#include_next?

    引用iOS有关包装器标头的文档 http developer apple com library ios documentation DeveloperTools gcc 4 0 1 cpp Wrapper Headers html inc
  • 使用 -static-libgcc -static-libstdc++ 编译仍然会导致对 libc.so 的动态依赖

    我正在尝试制作一个尽可能可移植的可执行文件 删除一些依赖项后 我在另一个系统上运行二进制文件时遇到以下问题 lib x86 64 linux gnu libm so 6 version GLIBC 2 15 not found requir
  • 如何将脚本的依赖项添加到 CMake 中的目标?

    链接我的程序后 我需要对其执行一些后处理 我添加了一个add custom command TARGET 效果很好 但是 这个额外的自定义命令运行一个脚本 未生成 它已签入代码库 并且我希望如果该脚本发生更改 目标将被视为过时 以便正确重建
  • cmake 找不到 boost 库,因为它查找错误的文件名

    我根据文档在 Windows 8 1 机器上构建了 boost 1 56 库 作为共享库和静态库 他们全部出现在BOOST ROOT stage lib目录 文件名格式如下 boost thread vc120 mt 1 56 dll bo
  • 利用 SSE 和其他 CPU 扩展

    在我的代码库中有几个地方 对于大型数据集 相同的操作会重复很多次 在某些情况下 处理这些需要花费相当长的时间 我相信使用SSE来实现这些循环应该可以显着提高它们的性能 特别是在对同一组数据执行许多操作的情况下 因此一旦数据最初被读入缓存 就
  • 如何更改 Xcode 中的编译器

    我正在 Xcode 4 6 3 中编译 C 代码 但我不知道我正在使用哪个编译器 我需要使用 gcc 4 2 提前致谢 If you really需要更改为 gcc 您可以在构建设置中执行此操作

随机推荐

  • JAVA 泛型中的 的应用场景

    在JAVA 泛型中 经常看到
  • 《市场调查与分析》:在校大学生对微信小程序的使用情况

    目录 一 研究背景和目的 1 1调查背景 1 2调查目的 二 调查内容 三 调查方式 四 调查对象及范围 五 抽样设计 六 调查问卷 七 调查分析 7 1问卷数据 7 2问卷信度效度分析 7 3调查基本情况 八 调查结论 8 1小程序的使用
  • 【Python基础】Python中读取图片的6种方式

    Python进行图片处理 第一步就是读取图片 这里给大家整理了6种图片的读取方式 并将读取的图片装换成numpy ndarray 格式 首先需要准备一张照片 假如你有女朋友的话 可以用女朋友的 没有的话 那还学啥Python 赶紧找对象去吧
  • html修改display属性的值,web开发设计--JS的innerHTML/display属性

    1 innerHTML 属性 innerHTML 属性用于获取或替换 HTML 元素的内容 语法 Object innerHTML 注意 1 Object是获取的元素对象 如通过document getElementById ID 获取的元
  • 获取多选下拉框(select标签设置multiple属性)的值

  • 给elasticsearch设置密码

    1 在elasticsearch yml中添加如下配置 xpack security enabled true xpack license self generated type basic xpack security transprt
  • Redis 缓存穿透、缓存击穿和缓存雪崩

    目录 Redis 缓存穿透 缓存击穿和缓存雪崩 Redis 缓存穿透 查不到 Redis缓存穿透的解决方案 方案一 接口校验 方案二 缓存空对象 方案三 布隆过滤器 Redis 缓存击穿 Redis 缓存击穿的解决方案 Redis 缓存雪崩
  • 数据库系统原理——ER模型与关系模型

    犹记得第一次看 数据库系统原理 时看天书的感觉 云里雾里 现在已经是第二次参阅这本书了 顿时有所感悟 哦 原来是这样 现在呢 开窍了一点 写下来且当作为笔记 ER模型 ER模型的基本元素是 实体 联系和属性 实体 是一个数据对象 指应用中可
  • 第19课 微信小程序安装使用mpvue脚手架

    第19课 微信小程序安装使用mpvue脚手架 详情地址 http mpvue com mpvue quickstart 安装前检查环境 安装脚手架之前需要电脑已安装node与npm 首先按住 shift 鼠标右键 按下 在此处打开命令行窗口
  • 关于Redis数据过期策略

    1 Redis中key的的过期时间 通过EXPIRE key seconds命令来设置数据的过期时间 返回1表明设置成功 返回0表明key不存在或者不能成功设置过期时间 在key上设置了过期时间后key将在指定的秒数后被自动删除 被指定了过
  • vsCode开发STM32设置头文件宏定义

    一 问题描述 使用 HAL 库新建 STM32 工程后 使用 vsCode 打开工程文件夹 会提示找不到头文件 以及比变量没有定义 如 uint32 t 不是一个有效类型等错误提示 如下图所示 二 原因分析 vsCode 中没有配置头文件路
  • 通过KXTF9-2050芯片分析I2C协议

    1 I2C协议 参见博客 I2C通信协议详解和通信流程分析 2 I2C驱动的框架分析 1 驱动框架分为两层 物理层和协议层 物理层是通用的 取决于主设备 协议层则每个从设备都不同 2 物理层 物理层可以理解成通用层 就是上面的介绍的I2C协
  • 嵌入式毕设分享 - stm32单片机酒精浓度酒驾检测系统 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 硬件设计 MQ 3酒精乙醇传感器模块 SIM800C模块 5 软件说明 系统框图 6 部分核心代码 7 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕
  • 腾然教育MCN覃小龙公子:覃宣量2022年2岁10个月亲子照

    2022年8月3日 我和爱人 还有公子覃宣量 一同前往之前媳妇定好的拍摄店 叫做在红光桥下面的那个店 专门是儿童摄影的 在柳州做了好多年的 我们一家三口 一大早 就过去拍照了 下面这组我3岁啦 儿童摄影师非常有创意 直接让儿子每一个字拍一个
  • 【Random库】

    文章目录 random库概述 random库解析 random库概述 随机数在计算机应用中十分常见 Python内置的random库主要用于产生各种分布的伪随机数序列 random库采用梅森旋转算法 Mersenne twister 生成伪
  • 电脑出现msvcp120.dll丢失的解决方法,教你三招快速解决

    msvcp120 dll丢失是一件很常见的问题 出现msvcp120 dll丢失会导致电脑无法在正常运行 那么应该怎么解决这个问题呢 有什么办法可以快速的解决呢 今天教你三招快速解决msvcp120 dll丢失的方法 一 msvcp120
  • 时序预测

    时序预测 MATLAB实现CNN SVM卷积支持向量机时间序列预测 目录 时序预测 MATLAB实现CNN SVM卷积支持向量机时间序列预测 预测效果 基本介绍 研究回顾 程序设计 参考资料 预测效果 基本介绍 CNN SVM预测模型将深度
  • iphone投屏ipad_教你手机投屏电脑

    最近有很多小伙伴一直留言需要投屏软件 今天果子就来讲解一下关于投屏的问题 如果大家家里或者身边有类似天猫盒子这种的设备都是可以直接利用苹果自带的投屏服务AirPlay 屏幕镜像 进行投屏至电视 而我们的电脑分为USB投屏和无线投屏 WIN1
  • Android获取手机信号强度汇总

    雪里香梅 先报春来早 宋 欧阳修 蝶恋花 如今的天气是越来略冷了 每每走在凛冽的寒风中 心里就一个想法 春 假 天 期 怎么还不到 不知道大家有没有同感 前两天要做一个获取手机信号的小程序 于是在网上搜索了很多 就找到两种方法 遗憾的是都没
  • 【编译】gcc make cmake Makefile CMakeList.txt 关系、使用

    文章目录 一 关系 二 gcc 2 1 编译过程 2 2 编译参数 2 3 静态库和动态库 1 后缀名 2 联系与区别 2 4 GDB 调试器 1 常用命令 三 make makefile 四 cmake cmakelist 4 1 语法特