【Linux03-基本工具之GCC】Linux下的C语言编译器

news2024/12/23 6:19:42

前言

接上篇,继续学习基本工具。

三、gcc

是什么

Linux下的C语言编译器(C++的编译器是g++,用法选项基本一样)。

既然是编译器,我们就再来加点餐……
在这里插入图片描述

链接其实分为两种类型:静态链接和动态链接,分别需要静态库和动态库。


加餐

动态链接

编译期间什么都不做,准备执行时,通过链接文件,将动态库载入内存。

  • 外部库变化影响程序
  • 可执行程序小

静态链接

编译期间把静态库的代码拷贝一份,编译完库就在可执行文件中。

  • 外部库变化不影响程序
  • 可执行程序大(重复包含更是十分冗余)

动态库

.so为后缀,程序准备运行时加载。

静态库

.a为后缀,程序编译时拷贝。

函数库名称

Linux下库的命名

动态库:libXXX.so

静态库:libYYY.a

去掉前缀"lib"和后缀".so"/".a"就是库名。

*windows下,动态库:.dll,静态库:.lib


怎么用

  • -E:编译,预处理完停下,可-o指定生成.i文件
  • -S:编译,汇编完停下,可-o指定生成.s文件
  • -c:编译,链接完停下,可-o指定生成.o文件
  • -o:编译,指定生成目标文件(直接-o生成可执行文件)
  • -std=c99:指定c99标准

首先看一下怎么在Linux上编译并运行一段代码:

[bacon@VM-12-5-centos 2-vim]$ cat test.c
#include <stdio.h>

#define NUM(n) n 

int main()
{
    //1111
    //2222
    //3333
    printf("hello vim %d\n",NUM(1));
    printf("hello vim %d\n",NUM(2));
    printf("hello vim %d\n",NUM(3));
    return 0;
}
[bacon@VM-12-5-centos 2-vim]$ gcc test.c -o test
[bacon@VM-12-5-centos 2-vim]$ ls
test  test.c

有了可执行程序,如何执行呢?

“./ + 可执行程序名”,找到路径即可执行。

[bacon@VM-12-5-centos 2-vim]$ ./test 
hello vim 1
hello vim 2
hello vim 3

那我们如何知道可执行程序是动态链接还是静态链接呢?

file [文件]

[bacon@VM-12-5-centos 2-vim]$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=896e927d85e4e51f3f11ab910c017db042736fbf, not stripped

能够知道:Linux默认选择动态动态链接。

我们还能查看它依赖的动态库——ldd [文件]

[bacon@VM-12-5-centos 2-vim]$ ldd test
	linux-vdso.so.1 =>  (0x00007fffe77c2000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fc7e976f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fc7e9b3d000)

我们去掉 “libc.so.6 => /lib64/libc.so.6 (0x00007fc7e976f000)” 的"lib"和后缀:c。

这就是c库。"0x00007fc7e976f000"就是我们依赖(需要)部分的起始位置。

[bacon@VM-12-5-centos 2-vim]$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Jul 25 16:58 /lib64/libc.so.6 -> libc-2.17.so
[bacon@VM-12-5-centos 2-vim]$ ls -l /lib64/libc-2.17.so
-rwxr-xr-x 1 root root 2156592 May 19  2022 /lib64/libc-2.17.so

原来,所谓"libc.so.6"是链接文件,链接到libc-2.17.so这个库,库的大小也能看到。

但,我们若有很多个程序都用这个动态库,不还是有很多份?

并没有,动态库只加载需要的部分,而且是共享的,所以也叫共享库。

如果我们想静态链接呢?

gcc -static

[bacon@VM-12-5-centos 2-vim]$ gcc test.c -static -o test_static 
[bacon@VM-12-5-centos 2-vim]$ ll
total 2
-rwxrwxr-x 1 bacon bacon   8360 Dec  1 08:17 test
-rwxrwxr-x 1 bacon bacon 861216 Dec  1 14:55 test_static
[bacon@VM-12-5-centos 2-vim]$ file test_static 
test_static: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=41f78cd6e97888d4295faa223090fd1d406097a3, not stripped

文件大小直接是百倍差距了。

*系统默认带动态库(系统运行需要它——Linux大部分指令是C写的),但不一定有静态库(可能需要自己安装)。

[bacon@VM-12-5-centos 2-vim]$ ls /usr/bin/which
/usr/bin/which
[bacon@VM-12-5-centos 2-vim]$ ldd /usr/bin/which
	linux-vdso.so.1 =>  (0x00007ffd21fae000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f8c708f8000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8c70cc6000

到这我们也能知道,系统为了支持我们编程,提供了动静态库(定义)和其.h文件(声明)。所以,

我的代码 + 库的代码(链接.lib和.o文件) = 可执行程序。


接下来,我们用gcc的选项一步步看程序编译的过程

-E 生成.i文件

[bacon@VM-12-5-centos 2-vim]$ ls
test.c
[bacon@VM-12-5-centos 2-vim]$ gcc test.c -E -o test.i
[bacon@VM-12-5-centos 2-vim]$ ls
test.c  test.i
[bacon@VM-12-5-centos 2-vim]$ vim test.i

在这里插入图片描述

-S 生成.s文件

[bacon@VM-12-5-centos 2-vim]$ gcc test.c -S -o test.s
[bacon@VM-12-5-centos 2-vim]$ vim test.s

在这里插入图片描述

-c 生成.o文件

[bacon@VM-12-5-centos 2-vim]$ gcc test.c -c -o test.o
[bacon@VM-12-5-centos 2-vim]$ vim test.o

在这里插入图片描述

以上是对于编译型语言,而对于解释型语言的一种运行方法:编辑完成后,给文件加上可执行属性就可以"./ filename"运行


今天的分享就到这里啦

这里是培根的blog,期待与你共同进步,下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内切相减原理绘制CAD图形

CAD中的内切相减的原理你们知道是什么意思吗&#xff1f;这个就需要用CAD实际图形的绘制过程来理解了&#xff0c;这个图形就用到了这个&#xff0c;还用到了CAD直线、修剪、圆等命令共同绘制出来。 目标图形 操作步骤 1.使用CAD直线命令绘制一条长度30的垂直直线AC&#xff…

自定义 HandlerMethodArgumentResolver 怎么和默认HandlerMethodArgumentResolver进行隔离的?

工作中&#xff0c;想对一些参数进行非空默认值的操作。 DefaultValueIfNull("1000") 这个就是&#xff0c;如果为null&#xff0c;那么就默认值填1000。 操作起来。 1.自定义HandlerMethodArgumentResolver Component public class DefaultValueIfNullResolver…

seata-server-1.5.2的部署

使用的是nacos和mysql数据库&#xff0c;简单部署在Win10上&#xff0c;Linux上配置修改相同&#xff0c;启动命令不同。 找到 seata-server-1.5.2\seata\conf目录下的application.yml和application.example.yml 编辑 application.yml&#xff0c;原始版本如下&#xff1a; s…

RocketMq: Windows环境-单机部署和伪集群、集群部署

关于默认端口 broker的默认端口有3个,10911, 10912, 10909。 10911是remotingServer使用的监听端口,remotingServer主要处理以下三类消息: producer发送的消息 conumser在消费失败或者消费超时发送的消息 consumer拉取消息10912是主broker用于监听从broker请求…

制作路由器openwrt安装及配置

Openwrt软路由安装配置1、 Openwrt软路由设备信息&#xff1a; <1>登录信息&#xff1a; IP&#xff1a;10.4.1.1 账号&#xff1a;root<2>设备配置&#xff1a; 主机名 Openwrt 型号 ASUSTeK COMPUTER INC. Z9PA-U8 Series CPU 型号 Intel(R) Xeon(R) …

YOLO系列目标检测算法——PP-YOLO

YOLO系列目标检测算法目录 - 文章链接 YOLO系列目标检测算法总结对比- 文章链接 YOLOv1- 文章链接 YOLOv2- 文章链接 YOLOv3- 文章链接 YOLOv4- 文章链接 Scaled-YOLOv4- 文章链接 YOLOv5- 文章链接 YOLOv6- 文章链接 YOLOv7- 文章链接 PP-YOLO- 文章链接…

爬虫之selenium

目录 selenium介绍 基本使用 selenium用法 元素操作 等待元素被加载 元素各项属性 执行js代码 切换选项卡 浏览器前进后退 无界面浏览器 xpath的使用 简单介绍 selenium中使用 异常处理 登录获取cookie保存 动作链 打码平台使用(验证码破解) selenium介绍 由…

JavaScript -- 正则表达式及示例代码介绍

文章目录正则表达式1 正则表达式的介绍2 创建正则表达式3 通过整个表达式检查字符串是否符合规则4 正则表达式的基本语法5 提取符合规则的字符串6 例子正则表达式 1 正则表达式的介绍 正则表达式用来定义一个规则通过这个规则计算机可以检查一个字符串是否符合规则或者将字符…

python PyQt6 常用操作以及常见问题解决

因为需求需要写一个简单的Python GUI界面&#xff0c;期间遇到了一些问题&#xff0c;在这里记录下 安装PyQt6: pip install pyqt6使用QTDesigner绘制界面&#xff1a; 我使用Anaconda下载的pyqt6里已经自带了两种工具&#xff0c;下面只需要把工具导入到pycharm中&#xff0…

[附源码]计算机毕业设计旅游网的设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

『Python学习笔记』使用Cython编程语言编译python文件

使用Cython编程语言编译python文件 文章目录一. Cython简介一. Cython编译2.1. 编译过程2.2. 环境安装2.3. disutils库2.4. 引入C源文件三. 总结参考文献一. Cython简介 Cython官网地址&#xff1a;https://cython.org/Cython的下载和安装&#xff1a;https://pypi.org/projec…

嵌入式分享合集117

一、获取STM32代码运行时间的技巧 测试代码的运行时间的两种方法&#xff1a; 使用单片机内部定时器&#xff0c;在待测程序段的开始启动定时器&#xff0c;在待测程序段的结尾关闭定时器。为了测量的准确性&#xff0c;要进行多次测量&#xff0c;并进行平均取值。 借助示波器…

NFV概述

NFV&#xff08;网络功能虚拟化&#xff09;是指利用虚拟化技术在标准化的通用IT设备&#xff08;X86服务器&#xff0c;存储和交换设备&#xff09;上实现各种网络功能。NFV的目标是取代通信网络中私有、专用和封闭的网元&#xff0c;实现统一通用硬件平台业务逻辑软件的开放架…

争议不断的AI绘画,靠什么成为了顶流?

今年以来&#xff0c;AIGC迅速崛起。所谓AIGC&#xff0c;即AI-Generated Content&#xff0c;指的是利用人工智能来生成内容&#xff0c;被认为是继专业产出内容&#xff08;PGC&#xff09;、用户产出内容&#xff08;UGC&#xff09;后的新型内容创作方式。不久前掀起热议的…

客户需求太多,如何有效沟通完成项目?

1、向客户明确&#xff1a;工作量、时间与质量的关系 需要想客户明确&#xff0c;某时间内在保障开发质量的前提下&#xff0c;实际的工作量。如果加大工作量&#xff0c;在赶工情况下&#xff0c;开发质量无法保障。如要保障开发质量&#xff0c;开发时间会延长&#xff0c;那…

【电力系统】基于Matlab实现风电光伏概率潮流计算

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

threejs官方demo学习(1):animation

前言 之前的threejs入门视频教学已经学习完了&#xff0c;下面会陆续学习官方demo。官方网址太卡了建议在本地进行搭建&#xff0c;具体见&#xff1a;threejs视频教程学习&#xff08;1&#xff09;&#xff1a;本地搭建threeJS官网、渲染第一个场景 官方的例子都是html格式…

Qt源码编译aarch等架构可参考

前言&#xff1a; 我的建议是&#xff1a; 编译环境一定要有网络&#xff0c;依赖的包才可以方便安装&#xff01;&#xff01;&#xff01; 一、准备工作 有网但ping不通、或者没有源的 可能需要先配置: 源路径&#xff1a; /etc/apt/source.list 系统默认DNS配置: /etc/r…

iTOP3588开发板编译Android内核方法一

iTOP3588开发板编译Android内核方法一&#xff1a; 在 Android 源码目录下执行如下命令编译 Android 内核&#xff1a; ./build.sh -CKA 编译完成后如下图所示&#xff1a; 编译后会在 rockdev/Image-rk3588_s 目录下生成 boot.img&#xff0c;boot.img 为内核镜像。boot.i…

《操作系统实战 45 讲》系统环境搭建 (Ubuntu + Vmware)

系统环境搭建 1. Ubuntu下载2. Vmware安装 Ubuntu系统2.1 配置电脑2.2 安装系统&#xff08;Ubuntu16.04&#xff09;3、配置网络和修改yum源3.1. 编辑 VMware 的网络配置3.2 windows 的网络配置3 .3 虚拟机网络 IP 修改地址配置3.4 修改yum源3.5 安装vm-tools1. Ubuntu下载 清…