Linux中编译C文件

摘要:
C/C++程序编译过程预处理、扩展头文件、宏定义、条件编译处理等。C/C++程序的编译方法和生成指定的文件。o文件,即对象文件。一般来说,它是从.c或编译而来的。cpp文件,相当于VC编译的obj文件。编译单个文件[.o]$gccfile。c#这是最简单的形式。默认输出为a.out$./a。out#执行$gccfile。c-o文件。o#生成指定的可执行文件$./file。o#执行写入并使用静态库[.a]$gcc-csub。c#-c:仅编译,不链接$ar-rsvlibsub。asp。o#链接静态库$gccmain。c-L./-ls子域。o#main。c: 主函数-L:库文件路径-L:库文件名,全名为libsub。a$./main。o执行写入并使用动态库[.so]$gcc-fpic共享olibsub。索苏布。c共享:指定动态连接库的生成-fpic:编译为位置无关代码$gccmain。c-主。o、 /libsub。所以$./main。o#执行

C/C++程序编译的过程

预处理,展开头文件,宏定义,条件编译处理等。通过gcc -E source.c -o source.i或者cpp source.c生成。

编译。这里是一个狭义的编译意义,指的是将预处理后的文件翻译成汇编代码的过程。通过gcc -S source.i生成。默认生成source.s文件。

汇编。汇编即将上一步生成的汇编代码翻译成对应的二进制机器码的过程。通过gcc -c source.s来生成source.o文件。

链接。链接是将生成目标文件和其引用的各种符号等生成一个完整的可执行程序的过程。链接的时候会进行虚拟内存的重定向操作。

上面四个步骤就是C/C++程序编译的几个基本步骤。前面三个步骤都是很简单,大多时候会合并为一个步骤。只有第四个步骤链接是复杂一点的。

C/C++程序编译方式及生成指定文件

.o文件,即目标文件。一般通过.c或者.cpp文件编译而来,相当于VC编译出来的obj文件。

.a文件,archive 归档包,即静态库。其实质是多个.o文件打包的结果,相当于VC下的.lib文件。

.so文件,shared object 共享库(对象),相当于windows下的dll。

(1) 编译单个文件[.o]

$gcc file.c            #这是最简单形式,缺省输出为a.out
$./a.out               #执行
$gcc file.c -o file.o  #生成指定的可执行文件
$./file.o              #执行

(2) 编写及使用静态库[.a](背景:main.c使用了sub.c中的函数,sub.c -> sub.o -> libsub.a)

$gcc -c sub.c                    #-c:只编译不链接
$ar -rsv libsub.a sub.o          #链接静态库
$gcc main.c -L./ -lsub -o main.o #main.c:主函数 -L:库文件路径 -l:后面接库文件名,全名为libsub.a
$./main.o                        #执行

(3) 编写及使用动态库[.so](背景:main.c使用了sub.c中的函数,sub.c -> libsub.so)

$gcc -fpic -shared -o libsub.so sub.c #-shared:指定生成动态连接库 -fpic:编译为位置独立的代码
$gcc main.c -o main.o ./libsub.so
$./main.o                             #执行

免责声明:文章转载自《Linux中编译C文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇BBR在实时音视频领域的应用【SSH网上商城项目实战19】订单信息的级联入库以及页面的缓存问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

go 环境搭建 以及 linux 下go环境交叉编辑链(arm)的搭建,error: invalid conversion from 'void*' to 'unsigned char*' [-fpermissive]

1,下载 Golang官网下载地址:https://golang.google.cn/dl/ 2,解压到指定目录 3,运行go 获取环境变量修改方法 go help env usage: go env [-json] [-u] [-w] [var ...] Env prints Go environment information. By defaul...

简单的linux内核移植知识

Linux内核的移植(ARM)总结 虽然没有干过这个工作,不过听说内核移植从来就不是一个人的事。通常都是由一个百人的团队去做的,所以这里讲的仅仅是最简单的一些。往往不去关心原理,只是懂得如何操作罢了。 知识储备 在学习移植之前,需要知道的知识和概念,操作系统启动的过程,bootloader,内核,根文件系统等。 计算机结构:两层结构:软件,硬件。 四层结构:...

Linux内核时间管理(二)——jiffies与jiffies_64释疑

    Linux内核中定义了jiffies变量来记录从系统启动到当前时刻系统时钟所产生的tick数。jiffies变量是一个无符号整型数值,即unsigned long类型。它的声明如下(在 include/linux/jiffies.h 中): extern u64 __jiffy_data jiffies_64;     由此可见,jiffies变量...

linux批量操作(一)

一、常用命令 1、关闭所有java进程命令:   ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9 2、批量文本操作   替换字符串:sed -i 's/原字符串/新字符串/g' /home/1.txt   删除字符串:sed -i '/字符串/d' file   字符...

linux编程lib的使用

今天由于要用到静态链接库,所以就学习了一下相关知识,总结如下:静态链接库(一般命名为libxxx.a)就是很多.o文件的集合,在你的项目中如果有一个子模快,这个子模块只是给总控模块提供一个函数接口,那么你就可以考虑把这个子模快编译成静态链接库libxxx.a,然后在总控模块中编译的时候,只需-L包含链接库所在的目录,再-lxxx引用链接库就行.当然,你也可...

petalinux2019.2 zcu106 build error

ug1209 1. Create a PetaLinux project using the following command:$petalinux-create -t project -s <path to the directory that hasxilinx-zcu102-v2019.2-final.bsp> petalinux-cr...