当前位置: 首页 > 科技观察

Java程序员眼中的gcc

时间:2023-03-17 01:34:44 科技观察

作为一名Java程序员,总是记不住gcc的基本使用,非常不熟练。今天写一篇文章,用最简单的方式记录一下。编译过程中写一段hello.c代码:#include#defineSTR"helloworld\n"voidmain(){printf(STR);}第一步:预处理(preprocess)其实就是下面这样3第一个动作:展开头文件中的宏定义,直接用条件编译替换。如果条件编译不成立,则将其移除。第三步:将汇编(assemble)转换成二进制(ELFrelocatable):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));}编译成可执行文件:#Writing1gcctest.c-otestlibadd.a#Writing2gcctest.c-otest-static-ladd-L./Execution:./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./执行发现错误:./testerrorwhilel加载共享库: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)OK,以上就是编译、静态库制作、动态库制作的过程。先记住这些gcc的基本常识,再研究原理!