Java 程序员眼里的 Gcc

开发
本文是编译、静态库制作、动态库制作的过程,先记住这些 gcc 的基本常识,再去研究原理吧!

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

编译的过程

写个 hello.c 代码:

#include <stdio.h>
#define STR "hello world\n"

void main() {
printf(STR);
}

第一步:预处理(preprocess)

其实就是以下三个动作:

  • 头文件展开
  • 宏定义直接替换
  • 条件编译不成立就去掉
gcc -E hello.c -o hello.i

第二步:编译(compile)

转换成汇编语言:

gcc -S hello.i -o hello.s

第三步:汇编(assemble)

转换成二进制(ELF relocatable):

gcc -c hello.s -o hello.o

第四步:链接(link)

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

# 动态链接
gcc hello.o -o hello
# 静态链接
gcc hello.o -o hello -static

静态库制作

写一个加法函数:

int add(int a, int b) {
return a+b;
}

编译成 .o:

gcc -c add.c -o add.o

制作成静态库:

ar rcs libadd.a add.o

编写测试代码:

#include <stdio.h>
void main(){
printf("%d", add(1,2));
}

编译成可执行文件:

#写法一
gcc test.c -o test libadd.a
#写法二
gcc test.c -o test -static -ladd -L ./

执行:

./test
3

动态库制作

写一个加法函数:

int add(int a, int b) {
return a+b;
}

编译成 .o:

gcc -c add.c -o add.o -fPIC

制作成动态库:

gcc -shared -o libadd.so add.o

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

gcc -fPIC -shared -o libadd.so add.c

编写测试代码:

#include <stdio.h>
void main(){
printf("%d", add(1,2));
}

编译成可执行文件:

gcc test.c -o test -ladd -L ./

执行发现报错:

./test
error while loading shared libraries: libadd.so:
cannot open shared object file: No such file or directory

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

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

cp libadd.so /lib64

再次执行就成功了:

./test
3

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

ldd test
linux-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 的基本常识,再去研究原理吧!

责任编辑:赵宁宁 来源: 低并发编程
相关推荐

2011-03-01 09:52:48

人才程序员

2013-08-16 09:30:18

IE浏览器

2013-08-16 10:03:27

程序员IE浏览器

2017-06-28 14:07:49

2014-07-14 10:05:23

程序员软件开发

2013-08-20 09:33:59

程序员

2012-11-08 09:49:30

C++Java程序员

2014-07-29 10:30:16

JavaJava程序员

2012-11-02 13:47:31

Java程序员编程

2011-05-13 14:34:02

程序员

2018-01-29 10:00:59

2012-03-06 09:22:46

程序员

2012-11-22 14:00:26

程序员

2017-11-14 21:30:15

2012-06-23 17:21:18

程序员

2009-06-25 09:33:43

Java API程序员

2009-05-21 15:58:12

程序员工作经验职场

2013-04-15 10:55:09

程序员

2010-08-27 10:34:51

程序员

2015-09-24 08:43:13

程序员未来
点赞
收藏

51CTO技术栈公众号