作为一名 Java 程序员,对 gcc 的基本使用总是记不住,很不熟练,今天写篇文章用最简单的方式记录下。
成都创新互联是一家集网站建设,夏河企业网站建设,夏河品牌网站建设,网站定制,夏河网站建设报价,网络营销,网络优化,夏河网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
写个 hello.c 代码:
#include
#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
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
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程序员眼里的Gcc
网站链接:http://www.mswzjz.cn/qtweb/news33/286183.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能