您的位置:首页 >聚焦 >

Java 程序员眼里的 gcc

2022-04-16 11:48:40    来源:程序员客栈

作为一名 Java 程序员,对 gcc 的基本使用总是记不住,很不熟练,今天写篇文章用最简单的方式记录下。

编译的过程

写个 hello.c 代码

#include#defineSTR"helloworld\n"voidmain(){printf(STR);}

第一步:预处理(preprocess)

其实就是以下三个动作

1. 头文件展开2. 宏定义直接替换3. 条件编译不成立就去掉

gcc-Ehello.c-ohello.i

第二步:编译(compile)

转换成汇编语言

gcc-Shello.i-ohello.s

第三步:汇编(assemble)

转换成二进制(ELF relocatable)

gcc-chello.s-ohello.o

第四步:链接(link)

具体分为动态链接和静态链接

#动态链接gcchello.o-ohello#静态链接gcchello.o-ohello-static

静态库制作

写一个加法函数。

intadd(inta,intb){returna+b;}

编译成 .o

gcc-cadd.c-oadd.o

制作成静态库

arrcslibadd.aadd.o

编写测试代码

#includevoidmain(){printf("%d",add(1,2));}

编译成可执行文件

#写法一gcctest.c-otestlibadd.a#写法二gcctest.c-otest-static-ladd-L./

执行

./test3

动态库制作

写一个加法函数。

intadd(inta,intb){returna+b;}

编译成 .o

gcc-cadd.c-oadd.o -fPIC

制作成动态库

gcc-shared-olibadd.soadd.o

上面两步也可以直接从源文件一步到位

gcc-fPIC-shared-olibadd.soadd.c

编写测试代码

#includevoidmain(){printf("%d",add(1,2));}

编译成可执行文件

gcctest.c-otest-ladd-L./

执行发现报错

./testerrorwhileloadingsharedlibraries:libadd.so:cannotopensharedobjectfile:Nosuchfileordirectory

因为执行的时候找不到指定的动态库。

那我们把 libadd.so 放在执行时的动态库默认搜索路径下,比如 /lib64

cplibadd.so/lib64

再次执行就成功了

./test3

查看二进制文件的链接信息,也可以发现我们的 libadd.so 生效了。

lddtestlinux-vdso.so.1=>(0x00007ffe0f597000)libadd.so=>/lib64/libadd.so(0x00007fa5ab29f000)libc.so.6=>/lib64/libc.so.6(0x00007fa5aaed1000)/lib64/ld-linux-x86-64.so.2(0x00007fa5ab4a1000)

好了,以上就是编译、静态库制作、动态库制作的过程,先记住这些 gcc 的基本常识,再去研究原理吧~

​​

关键词: 可执行文件 二进制文件 条件编译

相关阅读