Java 程序员眼里的 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 的基本常识,再去研究原理吧~
后宫佳丽们!
小黑向全体传智新老学员征稿啦!
方便大家对自己的优劣势了然于胸,合理部署,见招拆招,
在职场生涯对决中立于不败之地!
说明见下方
一、投稿类型
学习分享(学习方法、学习心得……)
技术文章(Java、前端、Python、大数据、人工智能……)
面试分享(面试题、面试故事、面试经验……)
职场感悟(入职攻略、职场趣事、职场八卦……)
文体不限,题材不限,只要你想写,小黑就帮你推!
二、稿件要求
1、必须原创首发,拒绝抄袭稿件,结尾可附带30字以内的个人介绍
2、字数在千字左右即可,投稿可附带图片,但不涉及版权问题
三、投稿激励
1、凡认真投稿的作者,无论被选中与否都可获得小礼品一份,稿件被选中可获得升级版礼品一份,未被选中的文章会给出修改建议,提高中稿率。
2、每一篇合格的稿件(无论被发表与否)都可累积1分,被发表的稿件可累积5分。积分还可额外兑换奖品。
3、增设阅读量榜、分享榜、点赞榜、留言榜,每季度各榜单排名第一位的作者可获得神秘礼物大奖!!!
四、怎么投
稿件以附件形式直接发到小黑黑的邮箱:[email protected]