linux下编译自己的库文件实践
的取巧,且破坏原库文件的纯洁性,不应是方法.
当然修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig需要有root权限,如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了. 3.相应的makefile的编写 makefile里怎么正确的编译和连接生成.so库文件,其他程序的makefile里面又是如何编译和连接才能调用这个库文件里的函数的呢?我们用下面的实例予以说明.当然上边的abc都是方法了.我们着重看一下makefile的写法,:-). [root@localhost sharelib2]#pwd /home/a/study/sharelib2 [root@localhost sharelib2]# ls so_test.h test_a.c test_b.c test.c test_c.c [root@localhost sharelib2]# vim Makefile [root@localhost sharelib2]# cat Makefile CC=gcc CFLAGS=-Wall -g -fPIC all:libtest.so test libtest.so:test_a.c test_b.c test_c.c $(CC) $(CFLAGS) -shared $? -o $@ test:test.c $(CC) $(CFLAGS) -L. -ltest $? -o $@ .PHONE:clean clean: -rm *.so -rm test
[root@localhost sharelib2]# ls Makefile so_test.h test_a.c test_b.c test.c test_c.c [root@localhost sharelib2]# make gcc -Wall -g -fPIC -shared test_a.c test_b.c test_c.c -o libtest.so gcc -Wall -g -fPIC -L. -ltest test.c -o test [root@localhost sharelib2]# ls libtest.so Makefile so_test.h test test_a.c test_b.c test.c test_c.c [root@localhost sharelib2]# ldd test linux-gate.so.1 => (0x004d2000) libtest.so => not found libc.so.6 => /lib/libc.so.6 (0x00ad9000) /lib/ld-linux.so.2 (0x00abc000) [root@localhost sharelib2]# LD_LIBRARY_PATH=. [root@localhost sharelib2]# ldd test linux-gate.so.1 => (0x00384000) libtest.so => ./libtest.so (0x00a19000) libc.so.6 => /lib/libc.so.6 (0x00ad9000) /lib/ld-linux.so.2 (0x00abc000) [root@localhost sharelib2]# ./test This is in test_a... This is in test_b... This is in test_c... [root@localhost sharelib2]# 编译目标文件时使用gcc的-fPIC选项,产生与位置无关的代码并能被加载到任何地址; 使用gcc的-shared和-soname选项; 使用gcc的-Wl选项把参数传递给连接器ld; 使用gcc的-l选项显示的连接C库,以保证可以得到所需的启动(startup)代码,从而避免程序在使用不同的,可能不兼容版本的C库的系统上不能启动执行. gcc –g –shared –Wl,-soname,libtest.so –o libtest.so.1.0.0 libtest.o –lc 在MAKEFILE中: $@ 表示规则中的目标文件集.在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合. $% 仅当目标是函数库文件中,表示规则中的目标成员名.例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是 "foo.a".如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空. contentlt; 依赖目标中的第一个目标名字.如果依赖目标是以模式(即"%")定义的,那么"contentlt;"将是符合模式的一系列的文件集.注意,其是一个一个取出来的. $? 所有比目标新的依赖目标的集合.以空格分隔. $^ 所有的依赖目标的集合.以空格分隔.如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份. 要生成.so文件,cc要带-shared 参数;要调用.so的 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |