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 的基本常识,再去研究原理吧~
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...