Linux--编译链接(过程、原理、执行、多个文件)

2023-11-04

1.编译链接四个步骤:

(1)预编译:

gcc -E main.c -o main.i

(2)编译

gcc -S main.i -o main.s

(3)汇编

gcc -c main.s -o main.o

(4)链接

gcc main.o -o main
执行: ./main
或者:全路径/main

2.编译链接的过程

 

(1)main.c 通过预编译 生成 main.i 文件
(2)main.i 通过编译生成 main.s 文件
(3)main.s 通过汇编生成 main.o 文件
(4)链接阶段 : 将所有的 .o .a( 静态库文件 ) .lib( 库文件 ) .obj 文件链接起来 , 生成 .out 文件
(5)ELF 格式的可执行文件 .out 文件 (Windows 生成的是 .ext 文件 )

3.编译链接各阶段的作用

(1)预编译阶段:

a)删除所有的"#define",并且展开所有的宏定义;

b)处理所有的条件预编译指令,"#if","#ifdef","#endif";

c)处理"#include"预编译指令,将被包含的文件插入到该预编译指令的位置;

d)删除所有的注释 ;
e)添加行号和文件名标识 , 以便于编译器产生调试用的符号信息及编译时产生编译错
误和警告时显示行号 ;
f) 保留所有的 #pragma 编译器指令 , 因为编译器需要使用它们 ;

(2)编译阶段

词法分析 , 语法分析 , 语意分析 , 代码优化 , 汇总符号 ;

(3)汇编阶段

将汇编指令翻译成二进制格式 , 生成各个 section, 生成符号表

(4)链接阶段

a) 合并各个 section, 调整 section 的起始位置和段大小 , 合并符号表 , 进行符号解析 , 给符
号分配虚拟地址 ;
b)符号重定位, 即在使用符号的地方全部替换成符号的虚拟地址 ;

4.执行

如何启动一个进程 :
路径+ 可执行文件名
可以把可执行文件放到 /usr/bin 就可以省略路径了

5.一步执行

(1)直接生成.o文件

可以三步合为一步 , 即不经过预编译 , 编译 , 汇编三步 , 直接一步生成 .o 文件 :
gcc -c main.c -o main.o
gcc -o main main.o

(2)可以四步合为一步:

gcc -o main main.c

6.多个源文件

(1)n+1

gcc -c main.c
gcc -c add.c
gcc -c max.
gcc -o main main.o add.o max.o

(2)一步完成

gcc -o main main.c add.c max.c

7.g++

gcc 误区 : 不能编译 c++ 文件 (gcc 可以编译 c++ 文件 ) gcc -o mainc++ mainc++.cpp -lstdc++ ( 指明用 c++ 的标准库 )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux--编译链接(过程、原理、执行、多个文件) 的相关文章

  • 如何从“git log”中查看 Git 中的特定版本?

    My git log显示为 enter code here git trial git log commit 4c5bc66ae50780cf8dcaf032da98422aea6e2cf7 Author king lt email pro
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • Linux 中的电源管理通知

    在基于 Linux 的系统中 我们可以使用哪些方法 最简单的方法 来获取电源状态更改的通知 例如 当计算机进入睡眠 休眠状态等时 我需要这个主要是为了在睡眠前保留某些状态 当然 在计算机唤醒后恢复该状态 您只需配置即可获得所有这些事件acp
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 进程名称长度的最大允许限制是多少?

    进程名称允许的最大长度是多少 我正在读取进程名称 proc pid stat文件 我想知道我需要的最大缓冲区 我很确定有一个可配置的限制 但就是找不到它在哪里 根据man 2 prctl http man7 org linux man pa
  • 具有少量父设备属性的 udev 规则

    我需要复杂且通用的udev规则来确定插入任何 USB 集线器的特定端口的 USB 设备 所以 我必须结合设备树不同层的父属性 我有这个 udevadm info query all name dev ttyUSB0 attribute wa
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • InstaPy:“错误,无法确定 64 位 Linux 的正确文件名”

    有人知道如何解决或解决这个问题吗 来自控制台的堆栈跟踪 执行后报告错误 InstaPy Version 0 6 9 Workspace in use home zanettra InstaPy Error unable to determi
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • 在 Ubuntu 16.04 上找不到 printf.c

    我最近切换到Ubuntu 16 04 我在用vscode作为 Ubuntu 上的 IDE 我配置了其他语言 但我无法做到这一点C C 我创建c cpp properties json launch json tasks json 当我开始编
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst

随机推荐

  • 分贝dB的换算

    1dB 0 115Np 公式 公式 d B 10 l g
  • adworld.xctf-web-新手练习区刷题

    1 View Source 根据题目 就能猜到 此处是查看页面源码 在查看的过程中发现右键不能使用了 那就用F12吧 2 Robots 这题是考察Robots协议 访问的时候页面是一片空白 直接输入robots txt 在地址栏输入robo
  • 微信小程序滚动Tab选项卡:左右可滑动切换

    最终效果如上 问题 1 tab标题总共8个 所以一屏无法全部显示 2 tab内容区左右滑动切换时 tab标题随即做标记 active 3 当active的标题不在当前屏显示时 要使其能显示到当前屏中 一 wxml结构 tab标题因一排八个
  • Redis学习笔记(持续更新中...)

    学习课程 尚硅谷Redis6 目录 NoSQL简介 NoSQL概述 NoSQL的特点 适用场景 NoSQL不适用场景 几种常见的NoSQL数据库 Memcache Redis MongoDB Redis Redis的底层 Redis的五大数
  • 获取扫描枪数据并存入TXT文档的C#程序代码

    我可以提供一段 C 语言代码 用于获取扫描枪数据并存入TXT文档 include
  • 数仓分层、设计、建模、架构

    一 数仓分层误区 数仓层内部的划分不是为了分层而分层 分层是为了解决 ETL 任务及工作流的组织 数据的流向 读写权限的控制 不同需求的满足等各类问题 业界较为通行的做法将整个数仓层又划分成了 DWD DWT DWS DIM DM等很多层
  • facenet专题1:windows下使用train_sotfmax.py训练人脸识别模型

    1 facenet github地址 https github com davidsandberg facenet 下载该project git clone https github com davidsandberg facenet 2
  • node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    VScode Code Runner无法运行JavaScript js文件 原因 未安装Node js 解决方法 https nodejs org en 下载Nodejs 安装完之后 重启VScode 会自动配置 运行即可在终端看到结果
  • 【tauri】tauri的启动、运行与打包过程步骤

    兼容性 win11 系统 自带 WebView2 win10 安装完会自动安装WebView2 win7 需要先手动来装WebView2 开始安装 安装node 推荐用nvm将进行node版本管理 安装vs 生成工具 下载地址 https
  • 单片机 嵌入式 毕业设计题目选题推荐

    文章目录 1前言 2 如何选题 2 1 不要给自己挖坑 2 2 难度把控 2 3 如何命名题目 3 单片机 嵌入式 选题大全 3 1 嵌入式方向 3 2 算法方向 3 3 移动通信方向 3 4 学长作品展示 4 最后 1前言 近期不少学弟学
  • 子类的构造函数和析构函数

    1 构造函数是否可以被继承 子类可以继承父类的所有成员变量和成员函数 但不能继承父类的构造函数 因此 在创建子类对象时 为了初始化从父类继承来的数据成员 系统需要调用其父类的额构造函数 2 父类构造函数的调用规则 如果子类没有定义构造函数
  • axios的三层封装思想

    1 工具函数层 设置默认请求地址 设置默认超时时间 设置默认请求拦截 设置默认响应拦截 ajax工具函数层 import axios from axios axios defaults baseURL http localhost 5000
  • vue2插件开发小试

    开发vue插件的官方文档是这样描述的 插件通常会为Vue添加全局功能 插件的范围没有限制 一般有下面几种 1 添加全局方法或者属性 如 vue element 2 添加全局资源 指令 过滤器 过渡等 如 vue touch 3 通过全局 m
  • KDD 2023

    下载地址 点我跳转 1 DoubleAdapt A Meta learning Approach to Incremental Learning for Stock Trend Forecasting Code None Area 一种用于
  • ubuntu 安装Pangolin 过程

    前言 大家好 好久没有写技术博客了 在工作学习中遇到一些问题及解决方法 希望能帮助到大家 Pangolin 想必大家都非常熟悉了 这个是一款开源的OPENGL显示库 可以用来视频显示 而且开发容易 代码我们可以从Github 进行下载 ht
  • JSP基础语法

    1 gt 2 gt hr
  • C++(13)——STl之List的实现

    STL STL是C 的标准模板库 是一个具有工业强度 高效的C 程序库 STL一个最为重要的特点就是数据结构和算法的分离 你可以使用其中的一些函数操作几乎热河的数据集合 包含链表 容器和数组 STL的另一个特性就是它不是面向对象的 STL主
  • 【环境配置】安装 Visual Studio 2022 Community 卡住了&& 安装 Windows SDK (Software Development Kits)卡住了

    问题原因 a 系统升级了 b 之前卸载没卸载干净 注册表里存在旧的信息 解决过程 1 查看日志 在资源管理器中输入 TEMP windowssdk 查看日志文件 找到最新的日志文件 在文件中搜索 Warning 出现了一组长串数字 用 括起
  • 基于Matlab小车倒立摆系统的控制(附上完整源码+数据)

    本文介绍了如何使用Matlab对小车倒立摆系统进行控制 倒立摆是一种经典的控制系统问题 通过控制小车的速度和方向 实现倒立摆的平衡 本文使用了模糊控制算法和PID控制算法来实现系统的控制 并通过Matlab进行仿真和实验验证 文章目录 1
  • Linux--编译链接(过程、原理、执行、多个文件)

    1 编译链接四个步骤 1 预编译 gcc E main c o main i 2 编译 gcc S main i o main s 3 汇编 gcc c main s o main o 4 链接 gcc main o o main 执行 m