linux环境基础开发工具2(gcc/g++ 、 make/ Makefile)

目录

        Linux编译器-gcc/g++使用

        Linux项目自动化构建工具-make/Makefile


 Linux编译器-gcc/g++使用

1. 背景知识

1.2 gcc/g++ -v 查看当前服务器的编译器版本

1.3 安装gcc / g++

sudo yum install -y gcc-c++

1.4 预处理 -> 编译 -> 汇编 -> 链接

[wxq@VM-4-9-centos Test]$ touch test.c #创建文件
[wxq@VM-4-9-centos Test]$ vim test.c  #用vim打开文件
[wxq@VM-4-9-centos Test]$ ll
total 4
-rw-rw-r-- 1 wxq wxq 83 Jan  9 20:50 test.c
[wxq@VM-4-9-centos Test]$ gcc test.c -o test #一步生成可执行文件   -o:指明告诉我们生成的可执行文件名
[wxq@VM-4-9-centos Test]$ ll
total 16
-rwxrwxr-x 1 wxq wxq 8360 Jan  9 20:51 test
-rw-rw-r-- 1 wxq wxq   83 Jan  9 20:50 test.c
[wxq@VM-4-9-centos Test]$ gcc -E test.c -o test.i  #-E :从现在开始进行程序的翻译,如果预处理完成,就停下来
[wxq@VM-4-9-centos Test]$ ll
total 36
-rwxrwxr-x 1 wxq wxq  8360 Jan  9 20:51 test
-rw-rw-r-- 1 wxq wxq    83 Jan  9 20:50 test.c
-rw-rw-r-- 1 wxq wxq 16877 Jan  9 20:51 test.i
[wxq@VM-4-9-centos Test]$ gcc -S test.i -o test.s  #-S:从现在开始进行程序的翻译,如果编译完成,就停下来
[wxq@VM-4-9-centos Test]$ ll
total 40
-rwxrwxr-x 1 wxq wxq  8360 Jan  9 20:51 test
-rw-rw-r-- 1 wxq wxq    83 Jan  9 20:50 test.c
-rw-rw-r-- 1 wxq wxq 16877 Jan  9 20:51 test.i
-rw-rw-r-- 1 wxq wxq   447 Jan  9 20:52 test.s
[wxq@VM-4-9-centos Test]$ gcc -c test.s -o test.o  #-c:从现在开始进行程序的翻译,如果汇编完成,就停下来
[wxq@VM-4-9-centos Test]$ ll
total 44
-rwxrwxr-x 1 wxq wxq  8360 Jan  9 20:51 test
-rw-rw-r-- 1 wxq wxq    83 Jan  9 20:50 test.c
-rw-rw-r-- 1 wxq wxq 16877 Jan  9 20:51 test.i
-rw-rw-r-- 1 wxq wxq  1496 Jan  9 20:52 test.o
-rw-rw-r-- 1 wxq wxq   447 Jan  9 20:52 test.s
[wxq@VM-4-9-centos Test]$ gcc test.o -o test_1  #链接
[wxq@VM-4-9-centos Test]$ ll
total 56
-rwxrwxr-x 1 wxq wxq  8360 Jan  9 20:51 test
-rwxrwxr-x 1 wxq wxq  8360 Jan  9 20:59 test_1
-rw-rw-r-- 1 wxq wxq    83 Jan  9 20:50 test.c
-rw-rw-r-- 1 wxq wxq 16877 Jan  9 20:51 test.i
-rw-rw-r-- 1 wxq wxq  1496 Jan  9 20:52 test.o
-rw-rw-r-- 1 wxq wxq   447 Jan  9 20:52 test.s
[wxq@VM-4-9-centos Test]$ 

在这里涉及到一个重要的概念:函数库

  • 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

函数库一般分为静态库和动态库两种

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”(优点是不依赖库,缺点是消耗资源大)
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。(优点是不消耗资源)
  • windows :".dll"(动态库)     ".lib"(静态库)
  • gcc hello.o –o hello
  • gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

查看所有的头文件

ls /usr/include/

gcc/g++下的体现:

[wxq@VM-4-9-centos Test]$ ls /lib64/libc.*
/lib64/libc.a  /lib64/libc.so  /lib64/libc.so.6//静态库: /lib64/libc.a 
//动态库: /lib64/libc.so.6

gcc、g++默认形成的可执行程序是动态链接的!!

ldd 文件名 :查看文件与共享库的依赖关系
file 文件名 :辨识文件类型

当然,也可以修改为静态链接:

-static

云服务器默认是没有静态库的,可以自行下载:

sudo yum install -y glibc-static   # C静态库
sudo yum install -y libstdc++-static  # C++静态库


 Linux项目自动化构建工具-make/Makefile

背景

  •  一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
示例:

1: Makefile                                                                                                                                            1 proc:proc.c2     gcc -o proc proc.c3 4 .PHONY:clean5 clean:6     rm -rf proc    

 说明:

此时我们会发现,程序会根据依赖关系,自动执行依赖方法,可以把这里的 make / make clean 理解为构建和清理,也就是vs下的:

关于 .PHONY :linux下的关键字,用来修饰伪目标,表示指令总是被执行的什么意思呢?请看示例:

这里我们习惯把 clean 设置成伪目标。

        另外:make指令是自上而下向下进行扫描,只会执行第一个遇到的目标文件,除此之外,我们想要执行新的目标需要在make后面带上目标文件
总结:—般我们把要执行的文件会放在第一个

示例:

这里会有一个疑问,当我们执行make指令的时候,make指令是如何知道当前文件时最新的?

这里的答案是:根据文件的最近修改时间,这里我们需要借助一条指令帮助我们理解 - stat  指令

  • 需要注意Access并不是每次访问都会被修改,因为数据是存储在磁盘上,每次访问数据都进行修改会降低访问磁盘的效率,所以现在通过linux内核的修复,Access只会达到一定次数只会才会被修改
  • 源文件一定是比可执行程序要早的,可执行程序的时间一定比源文件的时间要晚,make指令会比较两者的修改时间
     

示例:

写到可能会有人觉得这不是多此一举吗?我直接gcc/g++进行编译不香吗?原因是因为这里只是为了演示,实际项目中可能是多个文件进行编译。

示例:

[wxq@VM-4-9-centos lesson1]$ ll
total 16
-rw-rw-r-- 1 wxq wxq  61 Jan  9 13:23 main.c
-rw-rw-r-- 1 wxq wxq 170 Jan  9 13:36 Makefile
-rw-rw-r-- 1 wxq wxq  64 Jan  9 13:22 test.c
-rw-rw-r-- 1 wxq wxq  55 Jan  9 13:21 test.h
[wxq@VM-4-9-centos lesson1]$ cat test.h
#pragma once #include <stdio.h>extern void show();
[wxq@VM-4-9-centos lesson1]$ cat test.c
#include "test.h"void show()
{printf("hello linux\n");
}
[wxq@VM-4-9-centos lesson1]$ cat main.c 
#include "test.h"int main()
{show();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cesium wall 扩散墙(动态立体墙效果 Primitive 方法)

cesium wall 扩散墙(动态立体墙效果)以下为源码直接复制可用 1、实现思路 1、此效果运用cesium 中 Primitive 方法,通过传入中心点、半径、顶点数、颜色来进行加载。 2、运用 Math 方法 对传进来的中心点、半径、定点数,来计算个顶点经纬度。 3、通过Primitive 方法中upda…

漏洞复现-锐捷Ruijie系列

漏洞复现-锐捷Ruijie 绕过身份验证锐捷EG易网关 Admin/admin锐捷EG2000GE存在命令执行漏洞锐捷网络股份有限公司校园网自助服务系统存在目录穿越漏洞ruijie-eg-guestisup-ip-rce.yml🗡锐捷RG-UAC应用网关前台RCE数据库审计系统存在后台 downloadTcpDumpFiles⽂件读取锐捷交换…

整数序列删除指定数字,其他数顺序不变

#include <stdio.h>//整数序列删除一个数&#xff0c;其他数顺序不变 int main() {int arr[50] {0};//int arr[50] {1,2,3,4,5};int n 0;int del 0;int i 0;int j 0;scanf("%d",&n);for(i 0;i < n;i)scanf("%d",&arr[i]);scanf(&q…

Win11系统启动VMware上虚拟机蓝屏解决办法

背景 最近有在做一个项目的过程中需要使用虚拟机&#xff0c;用原来装好的的Vmware14打开虚拟机&#xff0c;直接蓝屏了&#xff0c;尝试了如下几种方法来解决&#xff0c;最好用的就是第二种&#xff0c;直接下载最新版本(在软件管家中直接下载)。 虚拟机 目前常用的虚拟机软…

【MySQL】深入解析索引实现原理

文章目录 1、索引介绍2、索引分类2.1、数据结构HashB Tree 2.2、存储方式聚簇索引非聚簇索引 2.3、功能特性主键索引唯一索引普通索引 2.4、字段数量单列索引多列索引 3、最佳实践3.1、索引覆盖3.2、回表操作3.3、最左匹配原则3.4、索引下推 1、索引介绍 对于MySQL数据库来说…

ADCSsync:基于ESC1执行DCSync技术和哈希转储的强大工具

关于ADCSsync ADCSsync是一款功能强大的临时性DCSync技术测试工具&#xff0c;该工具基于ESC1实现其功能&#xff0c;虽然该工具在运行速度方面没有优势&#xff0c;但ADCSsync能够在不使用DRSUAPI或卷影副本的情况下有效地执行临时DCSync攻击技术测试。 ADCSsync使用了ESC1从…

影响MySql 服务性能最重要的两个参数。

不同的需求&#xff0c;不同服务器硬件配置&#xff0c;要想MySql 服务处于最优状态是需要调试一些参数的&#xff0c;可调的参数非常多&#xff0c;在看完官方的mysql的文档&#xff0c;结合以前的配置情况在这里选择影响性能最大的参数作介绍&#xff1a; 先查一下参数情况&…

1 redis7概述

Redis7 1 Redis简介 Redis之所以称之为字典服务&#xff0c; 是因为 Redis 是一个 key-value存储系统。 支持存储的 value类型很多&#xff0c; 包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash&#xff08;哈希类型&#xff09;等。 Redis…

为什么说 Scroll 上的 PenPad,有望在本轮牛市行情中胜出?

随着ETF效应下&#xff0c;推动比特币不断突破前高&#xff0c;这也进一步推动市场走向牛市。事实上&#xff0c;在每一轮牛市行情中&#xff0c;都会涌现出大量的新项目&#xff0c;并伴随大量的资产面向市场&#xff0c;而如何帮助这些资产、项目实现更好的启动变得尤为关键。…

【话题】2024年AI辅助研发趋势,有那些应用领域

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】系列文章&#xff0c;这一次的话题是《2024年AI辅助研发趋势》 目录 背景概念实践医药领域汽车设计领域展望未来文章推荐 背景 随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅…

爬虫需要什么类型的代理ip?代理ip是必备的吗?

在信息时代&#xff0c;网络爬虫作为一种重要的数据采集工具&#xff0c;被广泛应用于各行各业。在这个过程中&#xff0c;代理IP成为了一个备受关注的话题。那么&#xff0c;爬虫需要什么类型的代理IP?代理IP是否是必不可少的呢? 今天我们就一起来看看~ 首先&#xff0c;我…

在Django中使用PyJWT实现登录及验证功能

目录 1、安装PyJWT 2、对信息加密及解密 3、配置登录视图和及url 4、登录装饰器 5、在验证有登录权限的的视图中登录 PyJWT的使用 1、安装PyJWT pip isntall pyjwt 2、对信息加密及解密 import jwt import datetime from jwt import exceptions# 加密盐 JWT_SALT &qu…