linux 编程c语言文件,linux 下C语言编程库文件处理与Makefile编写

本文介绍了作者在Linux环境下手动编译GCC的经验,包括预处理、编译、汇编和链接的步骤。作者通过创建静态库和动态库展示了库文件的管理和使用,并提到了使用makefile简化编译过程。学习过程中,作者发现了IDE在库文件处理上的便利性,并计划通过博客分享更多关于手动编译和makefile的知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做开发快3年了,在linux下编译安装软件算是家常便饭了。就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题。看来还是像vs、codeblocks这样的ide把人弄蠢了。便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目。今天学了2点,一个是库文件处理,另一个是makefile编写。

学习的系统是centos6.6,编译升级的gcc4.8.2,明天写个博客总结下这回gcc安装的过程,每次都能学到些东西。

gcc的编译过程

首先需要清楚gcc编译做了些什么

源文件----预处理---->预处理文件(*.i)----编译---->汇编文件(*.s)----汇编编译---->目标文件(*.o)----链接---->可执行文件

基本与windows下的类似。通过给gcc加一些选项,可以控制编译工作进行到指定的阶段,下面试常用的一些gcc编译选项

-c 编译,汇编源文件,不链接,得到*.o文件

-S 只编译,不汇编,得到*.s文件

-E 预处理文件,得到*.E文件

-o [dis] [src] 将src文件编译成可执行文件dis

-Idir 指定include包含文件搜索路径

-g 生成具有调试信息,如果不加这个选项,*.o文件中不会生成.debug段,在调试时将不能查看打印变量值

学习过c和c++的都知道,c或c++程序存在各种各样的库文件,就是已经编译好的包含数据和执行代码的二进制文件。windows就是dll文件,linux下有.a和.so文件。如果需要使用这些库文件,在ide环境下勾个选项就把事给办了,在手工编译的情况下就麻烦了点。

gcc创建和使用静态库

编写static_lib.c文件

3f4a5f29da945d65a1aa6b744d8bda8c.png

创建静态库

gcc -c static_lib.c

ar rcs static_lib.a static_lib.o

上面的命令会在当前目录下生产 static_lib.a 静态库文件

使用链接静态库

编写 static_lib.h文件

a2929417527dcc0a274064ab305a4ef6.png

编写main3.c文件,使用静态库中的方法

6560e564a7699adaecbd46cd1e8c833c.png

编译main3.c并链接静态库文件

执行

gcc main3.c -lstatic_lib.a -o app3

但却出现链接器ld找不到库的问题,把-l参数去掉就正常了

gcc main3.c static_lib.a -o app3

最后会生成可执行文件app3。静态库的特点是将库里的代码放到了执行文件里,如果修改了静态库的代码,要重新编译依赖它执行文件才能升级

gcc创建和使用动态库

动态库就是在有执行文件需要使用这个库时,动态加载到执行的库文件。

编写share_lib.c文件

5fc44fd4df32b4928c535fb4dfdc7029.png

创建动态库

因为需要与位置无关,所以需要使用-fPIC选项,gcc的选项有上千个,需要查询某个选项可以man gcc然后查找查看

gcc -shared -fPIC -o share_lib.so share_lib.c

生成的share_lib.so文件就是动态库文件,在使用这个库的程序使用时被动态加载,并没有被写入到别的执行文件中,所以当库文件修改,不需要去重新编译其他使用这个库的程序

使用动态库

share_lib.h文件声明函数

2f97704a3323f91ba15b35fb23e5cdfb.png

编写main4.c文件,include "share_lib.h" 文件

9247d3ba66278fae0ba11ed2268493d7.png

编译main4.c并链接动态库

gcc main4.c ./share_lib.so -o app4

生成的app4就是可执行文件.

编写makefile编译

将前面静态库的3个源文件main3.c,static_lib.c,static_lib.h放到一个目录下。

799108eaa5bdd59a188b946a7af69fed.png

编写Makefile文件。

d3a6fffc3561c88754afb966b3359d3d.png

其中冒号左边表示目标文件或者命令,命令也叫伪目标。

执行make

e39901601609589961d308cb5b445dbe.png

执行make clean可以清除编译产生的文件

0c67c19b7d2c1a7fa8c83792210913de.png

当然,这恐怕是最简单的makefile了,Makefile还有很多学的,我也在学习中,以后有收获会继续写博客记录,争取以后看大神写的makefile不要在略懂略懂了

LINUX下C语言编程调用函数、链接头文件以及库文件

LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

Linux下C语言编程实现spwd函数

Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

Linux基础与Linux下C语言编程基础

Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

Linux下C语言编程基础学习记录

VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

【转】Linux基础与Linux下C语言编程基础

原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

Linux下C语言编程中库的使用

零.问题 1. 为什么要用到库? 2. 我要用一个库,但是,尼玛命令行上该怎么写呢?或者说库文件如何使用? 3. Linux的库在那些地方? 4. 什么是静态库,什么是动态库,二者有啥区别? 5. 常 ...

linux下C语言编程,include的默认搜索路径

C语言编程时,发现细节的魅力很大.较为详细了看了一下关于include的知识,发现了几点新知: 1.include和include"头文件名" 如:incl ...

linux下编译自己的库文件实践

有了我传的那个资料,这个就没什么用了,那个太经典了,这个就是记录我自己的实践.:-) linux下文件的类型是不依赖于其后缀名的,但一般来讲:.o,是目标文件,相当于windows中的.obj文件.s ...

随机推荐

Cytoscape.js – 用于数据分析和可视化的交互图形库

Cytoscape.js 是一个开源的 JavaScript  图形库,您可以使用 Cytoscape.js 进行数据分析和可视化.Cytoscape.js 可以轻松的继承到你的网站或者 Web 应用 ...

hdu 4038 2011成都赛区网络赛H 贪心 ***

贪心策略 1.使负数为偶数个,然后负数就不用管了 2.0变为1 3.1变为2 4.2变为3 5.若此时操作数剩1,则3+1,否则填个1+1,然后回到5

mysqlbinlog -v --base64-output 与不加的区别

加-v与加-vv的区别: 加--base64-output=DECODE-ROWS与不加的区别:

Android动画 fillAfter和fillBefore

fillBefore是指动画结束时画面停留在此动画的第一帧; fillAfter是指动画结束是画面停留在此动画的最后一帧. java代码设置如下: /*****动画结束时,停留在最后一帧******* ...

Javascript基础引用类型之Object

虽然说ECMAScript也是一门对象语言,但是它和其他面向对象语言还是有区别的,它不具有类和接口等基本结构.所以在ECMAScript中一般说类指的是引用类型.创建Object实例的方式有两种: 第 ...

bug:翻页

本章主要分享下,个人测试经历中遇见过的翻页bug 一.列表翻页 1.bug1:去请求翻页page=0,从0页开始算.一般来说page=0 和 page=1的数据是一模一样,所以翻第2页时会发现和第1页 ...

深入解析Java反射基础

博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...

4. SpringBoot —— 单元测试

首先在pom文件中引入spring-boot-starter-test org.springframework.boot

cxf 介绍

CXF 编辑     目录 1Apache CXF 简介 关于Apache CXF 功能特性 项目目标 2Apache CXF特点 灵活部署 支持多种编程语言 代码生成     1Apache CXF ...

java 多线程之:synchronized

synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在. 当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,syn ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值