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

news2024/11/17 6:24:46

目录

        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.c
  2     gcc -o proc proc.c
  3 
  4 .PHONY:clean
  5 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.coloradmin.cn/o/1516421.html

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

相关文章

如何在Windows搭建WebDav服务,并外网可访问

目录 1. 安装IIS必要WebDav组件 2. 客户端测试 3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网 3.1 打开Web-UI管理界面 3.2 创建隧道 3.3 查看在线隧道列表 4. 公网远程访问 4.1 浏览器访问测试 4.2 映射本地盘符访问 4.3 安装Raidrive客户端 总结&…

Could not use APOC procedures

报错内容&#xff1a; Traceback (most recent call last):File "/root/anaconda3/envs/sakura/lib/python3.9/site-packages/langchain_community/graphs/neo4j_graph.py", line 205, in __init__self.refresh_schema()File "/root/anaconda3/envs/sakura/lib…

基于ACM32 MCU的两轮车充电桩方案介绍,有利于打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

C语言--sprintf()函数的用法

一.sprintf()语法 sprintf&#xff08;&#xff09; 是一个 C 语言中的函数&#xff0c;用于将格式化的数据写入一个字符串中。它的用法与 printf() 函数相似&#xff0c;printf&#xff08;&#xff09;函数是将内容输出到屏幕上&#xff0c;而sprintf()函数是将格式化的内容输…

基于大模型和向量数据库的 RAG 示例

1 RAG 介绍 RAG是一种先进的自然语言处理方法&#xff0c;它结合了信息检索和文本生成技术&#xff0c;用于提高问答系统、聊天机器人等应用的性能。 2 RAG 的工作流程 文档加载&#xff08;Document Loading&#xff09; 从各种来源加载大量文档数据。这些文档…

基于微信小程序的校园跑腿小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

SpringBoot(接受参数相关注解)

文章目录 1.基本介绍2.PathVariable 路径参数获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 3.RequestHeader 请求头获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 4.RequestParameter 请求获取参数信息1.代码实例…

08-java基础-锁之AQSReentrantLockBlockingQueueCountDownLatchSemapho

文章目录 0&#xff1a;AQS简介-常见面试题AQS具备特性state表示资源的可用状态AQS定义两种资源共享方式AQS定义两种队列自定义同步器实现时主要实现以下几种方法&#xff1a;同步等待队列条件等待队列 1&#xff1a;AQS应用之ReentrantLockReentrantLock如何实现synchronized不…

如何选购自助咖啡机?这三点是关键!

在竞争激烈的咖啡市场中&#xff0c;既有知名咖啡连锁品牌&#xff0c;也有众多咖啡馆和小型连锁店&#xff0c;无人智能饮品机要想在激烈的竞争中脱颖而出&#xff0c;发挥自身优势&#xff1a;快速便捷是关键&#xff0c;同时好的口感才能留客&#xff0c;因此饮品机的选购成…

MES管理系统中电子看板都有哪些类型?

随着工业信息化和智能制造的不断发展&#xff0c;MES管理系统已经成为现代制造业不可或缺的重要工具。MES管理系统通过集成和优化生产过程中的各个环节&#xff0c;实现对生产过程的实时监控、调度和管理&#xff0c;提高生产效率和质量。 在生产制造过程中&#xff0c;看板管…

第七届国际通信与网络工程会议(ICCNE 2024)即将召开!

2024年第七届国际通信与网络工程会议&#xff08;ICCNE 2024&#xff09;将于7月26-28日在越南岘港召开。本次会议由维新大学主办&#xff0c;岘港大学、胡志明市科技大学协办。ICCNE 2024旨在为来自行业和学术界的研究人员、从业者和专业人士提供论坛&#xff0c;分享其最新研…

vid2vid(Video-to-Video Synthesis)论文详读和理解

论文&#xff1a;https://arxiv.org/abs/1808.06601 代码&#xff1a;https://github.com/NVIDIA/vid2vid

Linux系统部署Swagger Editor结合内网穿透实现公网管理本地接口文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xf…

Win7安装 .NET Framework 4.6.2 产生阻滞的问题

如图&#xff1a; 解决方案&#xff1a;安装补丁 windows6.1-KB976932-X64 补丁下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1_pIflWRKriAheAweJVkXFQ 提取码&#xff1a;6a1q

如何在Linux部署Docker Registry本地镜像仓库并实现无公网IP远程连接

文章目录 1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址 Docker Registry 本地镜像仓库,简单几步结合cpolar内网穿透工具实现远程pull or push (拉取和推送)…

HTML静态网页成品作业(HTML+CSS)——电影加勒比海盗介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

供应IMX290LQR-C芯片现货

长期供应各品牌芯片现货&#xff0c;SONY索尼SONY索尼CMOS/CCD芯片全系列全新现货优势出&#xff1a; IMX225LQR-C IMX415-AAQR-C IMX290LQR-C imx273llr-C IMX397CLN-C IMX637-AAMJ-C IMX647-AAMJ-C IMX991-A***-C IMX991-AABJ-C IMX287LLR-C IMX287LQR-C IMX297L…

【李沐论文精读】CLIP改进工作串讲精读

参考&#xff1a;CLIP改进工作串讲&#xff08;上&#xff09;、CLIP改进工作串讲&#xff08;下&#xff09;、李沐精读系列、CLIP 改进工作串讲&#xff08;上&#xff09;笔记 由于是论文串讲&#xff0c;所以每个链接放在每一个小节里。 CLIP的应用如下&#xff1a; 回顾&a…

mineadmin 快速安装部署(docker环境)

前提条件&#xff1a;已安装docker 一、下载dnmp环境包 github地址&#xff1a;https://github.com/tomorrow-sky/dnmp gitee地址&#xff1a; https://gitee.com/chenjianchuan/dnmp 二、看一下dnmp包目录结构 三、打开docker-compose.yml 文件&#xff0c;将不需要…

使用Python批量实现在Excel里新加一列

目录 一、引言 二、所需库介绍 三、代码实现 四、批量处理多个Excel文件 五、注意事项与扩展 六、案例演示 七、总结与展望 一、引言 Excel作为广泛使用的电子表格软件&#xff0c;在数据处理和分析中扮演着重要角色。然而&#xff0c;当面对大量Excel文件需要批量处理…