【Linux】Linux中的gcc/g++编译器的使用

2023-11-10


需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。 


目录

一、编译的过程

1、预处理阶段

1.1预处理的工作——头文件展开、去注释、宏替换、条件编译

1.2外部定义宏(-D选项)

1.3Linux中头文件的路径

2、编译——编译是把C语言处理为汇编语言

3、汇编——把汇编转为可重定向二进制目标文件(不可执行)

4、链接——把自己写的代码和C库中的代码合并成二进制程序(可执行)

二、动态链接和静态链接

1、动态链接

动态链接的优缺点

2、静态链接

静态链接的优缺点

3、程序动、静态链接的区分

3.1查看程序是动、静态的方法

3.2查看程序依赖的动态库

3.3静态程序的生成

3.4关于动、静态库的问答


一、编译的过程

观察编译和链接的内部流程,文件在每一步都发生了什么?

1、预处理阶段

1.1预处理的工作——头文件展开、去注释、宏替换、条件编译

gcc -E test.c -o test.i

-E表示当程序处理完预处理阶段就停下来;

-o指明生成的临时文件的名称(.i)。Linux不认后缀,这个.i是给用户看的。

1.2外部定义宏(-D选项)

gcc test.c -Dc=5//在外部给test.c定义c=5
gcc test.c -DJLY//在外部给test.c定义宏JLY

注意这里在外部定义的宏仅在生成的a.out文件中生效,原test.c文件中并无改变。

1.3Linux中头文件的路径

/usr/include/stdio.h

可以通过vim查看头文件,在头文件中搜索库函数。

可以根据头文件进行代码补齐。

2、编译——编译是把C语言处理为汇编语言

gcc -S test.c -o test.s

-S表示进行程序的编译工作,编译完成之后就停止。

3、汇编——把汇编转为可重定向二进制目标文件(不可执行)

gcc -c test.c -o test.o

4、链接——把自己写的代码和C库中的代码合并成二进制程序(可执行)

gcc test.o
gcc test.c 
gcc test.c -o mytest//将a.out改名为mytest

二、动态链接和静态链接

1、动态链接

通过链接器和库建立链接。可以理解为建立动态链接需要去C标准库等外部库里找对应的函数等。

动态链接的优缺点

优点:形成的可执行程序较小,下载便捷;能够节省磁盘存储空间,且程序加载到内存的时间快。

缺点:依赖动态库,程序的可移植性比较差。(运行时问题)

2、静态链接

静态链接指直接将所需的函数等代码直接加入到程序当中。

静态链接的优缺点

优点:不依赖第三方库,程序的运行可移植性较好。

缺点:形成的可执行程序体积大。

3、程序动、静态链接的区分

3.1查看程序是动、静态的方法

file 可执行程序

3.2查看程序依赖的动态库

ldd 可执行程序

动态库:libxxxx.so

静态库:libxxxx.a

Linux中库的命名:去掉前缀lib,去掉后缀.so,剩下的就是库的名称。例如libc.so.6中所依赖的库为c库。

3.3静态程序的生成

Linux中可执行程序默认使用动态链接,那么静态程序可以使用-static。

sudo yum install glibc-static//安装C静态库
sudo yum install libstdc++-static//安装c++静态库
gcc test.c -o mytest_static -static//生成静态程序mytest_static

3.4关于动、静态库的问答

1、如果下载一个C语言写的程序,需不需要下载额外的C标准库?

动态文件所依赖的库基本上变化不大,而静态文件不需要依赖动态库,所以均不用额外下载C标准库。

2、静态链接,拷贝的代码从何而来?

静态链接需要系统中存在.a结尾的静态库,从该静态库中拷贝代码。

如果系统中没有动态链接库,仅有静态链接库,即便不加-static,生成的可执行程序也是静态链接的。

3、Windows下动、静态库的区分

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

【Linux】Linux中的gcc/g++编译器的使用 的相关文章

  • 当下一条(跳过)指令是变量定义时,Shellcode 中的 JMP 意外行为

    Purpose 我试图利用 x86 64 中的 RIP 模式 尽管程序集本身按预期执行 但 shellcode 却没有 问题 简而言之 我尝试过的是这样的 jmp l1 str1 db some string l1 other code l
  • pip install reportlab 错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1

    使用 ubuntu 虚拟环境 我尝试安装reportlab 命令是 pip install reportlab 在这个目录下 company2 stefano stefano X550EP htdocs company2 错误是 error
  • 检测后台操作

    在C中 检测程序在 后台模式 下调用的方法是什么 我有一个程序想要以交互方式或在后台启动 我怎样才能检测到我不应该从标准输入读取并以 已停止 tty 输入 状态结束 我应该测试 stdin 是否已关闭 我怎样才能做到这一点 编辑 isatt
  • 如何在 arago 项目构建中编写自己的食谱包

    我如何在 arago 项目构建中编写自己的食谱包 我知道它可以是 bitbake 文件 但我怎么写 不知道 我在互联网上搜索 但未能找到任何好的来源 有人可以给我提供链接或示例来开始吗 RegardsLinux 学习者 使用 Bitbake
  • 是否有一种异步信号安全的方式来读取 Linux 上的目录列表?

    SUSv4 http pubs opengroup org onlinepubs 9699919799 functions V2 chap02 html tag 15 04 03 03未在其异步信号安全函数列表中列出 opendir rea
  • 安装 Ta-lib 会产生 gcc 错误

    当我尝试在我的 mac 上将 Ta lib 作为全局包安装时 出现 gcc 错误 我收到以下错误 gcc Wno unused result Wsign compare Wunreachable code DNDEBUG g fwrapv
  • 设置 nginx 具有多个 IP

    我的 nginx 配置文件位于 etc nginx sites available 下 有两个上游说 upstream test1 server 1 1 1 1 50 server 1 1 1 2 50 upstream test2 ser
  • malloc和gcc优化2

    while count lt 30000000 malloc 24 count 上面的代码在我用 gcc O0 编译的计算机上运行大约需要 170 毫秒 但是 使用 Ox 其中 x gt 0 进行编译时 优化器会巧妙地发现所请求的内存永远不
  • 如何在 Linux/Unix 上根据文件类型添加文件扩展名?

    这是一个关于 Unix shell 脚本 任何 shell 的问题 但任何其他 标准 脚本语言解决方案也将受到赞赏 我有一个充满文件的目录 其中文件名是这样的哈希值 fd73d0cf8ee68073dce270cf7e770b97 fec8
  • 结束 perl 脚本而不等待系统调用返回

    我在 Linux Ubuntu 14 04 上运行一个简单的 apache Web 服务器 并使用 perl CGI 脚本处理一些请求 该脚本使用以下命令启动系统命令system函数 但我希望它立即返回 无论系统调用的结果如何 我一直在传递
  • 为 Python 终端提供持久的历史记录

    有没有办法告诉交互式 Python shell 保留会话之间执行命令的历史记录 当会话运行时 在执行命令后 我可以向上箭头并访问所述命令 我只是想知道是否有某种方法可以保存一定数量的这些命令 直到下次使用 Python shell 时 这将
  • 如何将发布档案转换为 git repo

    我有一个发布档案列表 MyProject 0 9 zip MyProject 1 0 zip MyProject 1 3 tar gz MyProject 2 0 tar gz 每个文件都包含一个与存档同名的文件夹 不带文件扩展名 其中包含
  • 如何使用 C 程序获取机器的 MAC 地址?

    这个问题和这个问题完全一样 如何使用 C 程序获取机器的 MAC 地址 https stackoverflow com questions 1779715 how to get mac address of your machine usi
  • 具有多个文件扩展名的查找命令

    我正在查看许多子目录 找到所有以 JPG jpg 和 png 结尾的文件 并将它们复制到一个单独的目录中 但是现在只找到 JPG 有人可以解释我做错了什么吗 find root TEST Images name png o name jpg
  • rusage 进程/线程的 Cpu 时间不可能

    我正在计算进程 线程正在使用的 cpu 时间之间的增量 以及某个函数的调用之间的增量 我得到了进程 cpu 时间不可能的值 有时下一次调用会返回较小的 cpu 时间 这是不可能的 这是我用来计算CPU时间的代码 u64 CpuTime ca
  • __NR_gettid 和 SYS_gettid 之间的区别

    我只是在寻找在 Linux 中获取唯一线程 ID 的方法 我发现的方法是将两个参数中的任何一个作为参数进行系统调用 NR gettid OR SYS gettid 有人能解释一下它们之间有何不同吗 Nothing in
  • 无法通过 SSH 连接到 Google 计算引擎

    我在一个新项目中设置了一个新的 Google Compute Engine 实例 我启动实例并使用命令gcloud init连接到我的项目 然后我使用命令sudo gcloud compute ssh instance 1 它引导我完成 S
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • 无法使用 linux perf 对硬件缓存事件进行采样

    由于某种原因 我无法采样 perf record 硬件缓存事件 perf record e L1 dcache stores a c 100 sleep 5 perf record Woken up 1 times to write dat
  • linux + ksh + 向下舍入或向上舍入 - 浮点数

    在我的 ksh 脚本中 我只需要计算整数 有时我会得到浮点数 例如 3 49 或 4 8 等 所以我需要根据以下规则将浮点数转换为整数 示例 3 49 will be 3 2 9 will be 3 4 1 will be 4 23 51

随机推荐

  • 史上最全的java随机数生成算法(转)

    转自 http www zuidaima com share 1585762703215616 htm package com test util import java util Random public class RandomUti
  • 关于elasticsearch与kibana、IK分词器

    初识elasticsearch 正向索引和倒排索引 什么是文档和词条 每一条数据就是一个文档 对文档中的内容分词 得到的词语就是词条 elasticsearch就是面对文档存储的 可以是数据库中的一条商品数据 一个订单信息 文档数据会被反序
  • 找出字符串中第一次出现一次的字符的算法。

    链接 https www nowcoder com questionTerminal d370c322d06945a5901e8436d1e2e681 orderByHotValue 1 page 1 onlyReference false
  • 我为什么要学习Rust

    最早接触到 Rust 是在几年前的一次技术大会上 黄东旭说 TiKV 是用 Rust 语言编写的 引起了我的一些兴趣 但只是保持关注而已 我一直认为每一种编程语言都有着各自的典型应用领域 也有着各自的编程范式 没有最好的编程语言 参见 PH
  • 不讲武德---不用代码爬虫

    有人问 我不会代码 我能爬虫吗 我 很快啊 回答 可以 不需要写代码的 那当然是需要工具了 较为熟知的爬虫工具有八爪鱼 和web scraper 这次我所使用的是web scraper 安装web scraper 这篇文章讲述的算清晰的了
  • JetBrains插件推荐

    JetBrains软件本身就是效率神器 配合上一些好用的插件 效率就更是飞升了 本文就简单记录一些好用的插件和简介 持续更新 安装方法都很简单 这里就不过多叙述了 实在不会就百度一下 Chinese Simplified Language
  • smb windows中使用的文件共享协议(主要用于与windows互通)

    主要是samba服务 SMB协议又成为CIFS Common Internet File System 协议 samba服务功能 1文件共享 2打印共享 3加入windows2000 2003 2008域环境 4通过windows域环境进行
  • 黑马程序员并发编程笔记(二)--java线程基本操作和理解

    3 java进程的基本操作 3 1 创建进程 方法一 直接使用 Thread 构造方法的参数是给线程指定名字 推荐给线程起个名字 用setName 也可以 Thread t1 new Thread t1 Override run 方法内实现
  • 跳跃游戏(LeetCode)

    一 题目 55 跳跃游戏 难度 中等 给定一个非负整数数组 nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 示例1 输入 nums 2 3 1 1 4 输出 true
  • fftw3/gsl/kissfft/OouraFFT库中傅里叶变换/反傅里叶变换函数和Matlab中的fft/ifft的对应关系

    先分析一维度的 一 fftw plan dft 1d 正变换 fftw complex in fftw malloc sizeof fftw complex n fftw complex out fftw malloc sizeof fft
  • 如何用Flask和Redis来动态维护Cookies池

    为什么要用Cookies池 目标网站需要登录才能爬取 例如新浪微博 爬取过程中 如果请求频率过高 会导致封号 这就需要维护多个账号的Cookies池实现大规模爬取 Cookies池的要求 自动登录更新 定时验证筛选 提供外部接口 Cooki
  • 如何使用JAVA获取当前环境下的MAC地址

    在Windows下很简单直接运行脚本命令就可以了 public static String getMac try Process process Runtime getRuntime exec cmd exe c ipconfig all
  • 2023,8种必备Selenium编写自动化用例的技巧!

    在开始自动化时 您可能会遇到各种可能包含在自动化代码中的方法 技术 框架和工具 有时 与提供更好的灵活性或解决问题的更好方法相比 这种多功能性导致代码更加复杂 在编写自动化代码时 重要的是我们能够清楚地描述自动化测试的目标以及我们如何实现它
  • SPADE阅读笔记

    SPADE阅读笔记 目录 SPADE阅读笔记 作者的方法 spatial adaptive denormalization SPADE generator 为啥SPADE work better 同样的 作者提出一个simplt but e
  • 分巧克力(蓝桥杯C/C++B组真题详解)

    目录 题目 编辑 题目思路 代码详解 题目 题目思路 因为答案唯一 且分布在一个区间里面 我们可以想到二分答案 直到找到最小的满足的条件的 合适答案 代码详解 include
  • JavaScript的运算符

    目录 一 算术运算符 1 优先级 2 模运算 3 4 自增 5 自减 二 关系运算符 比较运算符 三 逻辑运算符 1 逻辑与 2 逻辑或 3 逻辑非 四 赋值运算符 1 格式 2 要求 3 复合赋值运算符 五 位运算符 1 按位与 2 按位
  • edp和edt哪个好_香水edt和edp什么意思 香水等级分类说明

    这次引发我写这篇小科普的灵感 是因为我恰巧看到一个文在各种溢美之词地推荐一款售价过千的EDT小众香水 EDT留香很短 卖价过千让我实在有点难接受 现在安利香水的推文随处可见 但发现不少只是一个劲地赞美多好闻 却连最基本的香水等级分辨都没好好
  • java 日志时间错误

    java 时区错误 解决方法 问题 参考链接 电脑上所有 java 应用 项目时间都不对 核心业务系统启动后日志时间和当前系统时间差11个小时30分钟 电脑用的是云桌面系统有严格的权限控制 找相关人和同事弄了几次没好 都知道是时区问题 但没
  • Vue3-wangeditor富文本编辑器的使用

    wangeditor官网 用于 Vue React wangEditor开源 Web 富文本编辑器 开箱即用 配置简单https www wangeditor com v5 for frame html vue3 按照官网提示安装 两个都要
  • 【Linux】Linux中的gcc/g++编译器的使用

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 编译的过程 1 预处理阶段 1 1预处理的工作 头文件