linux下编译自己的库文件实践
{
printf("This is in test_b...n"); } [root@localhost sharelib]# cat test_c.c #include <stdio.h> #include "so_test.h" void test_c() { printf("This is in test_c...n"); } [root@localhost sharelib]# gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so [root@localhost sharelib]# ls libtest.so so_test.h test_a.c test_b.c test_c.c [root@localhost sharelib]# vim test.c [root@localhost sharelib]#cat test.c #include "so_test.h" int main() { test_a(); test_b(); test_c(); return 0; } [root@localhost sharelib]# gcc test.c -L. -ltest -o test [root@localhost sharelib]# ls libtest.so so_test.h test test_a.c test_b.c test.c test_c.c [root@localhost sharelib]# ldd test linux-gate.so.1 => (0x00c3b000) libtest.so => not found libc.so.6 => /lib/libc.so.6 (0x00ad9000) /lib/ld-linux.so.2 (0x00abc000) [root@localhost sharelib]# ./test ./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory [root@localhost sharelib]# ls libtest.so so_test.h test test_a.c test_b.c test.c test_c.c [root@localhost sharelib]#cp libtest.so /lib/ [root@localhost sharelib]# ldconfig [root@localhost sharelib]# ldd test linux-gate.so.1 => (0x007b7000) libtest.so => /lib/libtest.so (0x007cf000) libc.so.6 => /lib/libc.so.6 (0x00ad9000) /lib/ld-linux.so.2 (0x00abc000) [root@localhost sharelib]# ./test This is in test_a... This is in test_b... This is in test_c... (2)、编译参数解析 最主要的是GCC命令行的一个选项: -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接.相当于一个可执行文件 -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的. -L.:表示要连接的库在当前目录中 -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称 (3)、调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件.其实编译链接上了共享库不代表执行时可以找到.“-L”什么的对执行没有用,你需要指明共享库的路径.方法有三个: a.修改 LD_LIBRARY_PATH,指明共享库的路径.LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径.在终端下使用如下命令: [root@localhost sharelib]# export LD_LIBRARY_PATH = . [root@localhost sharelib]# export LD_LIBRARY_PATH = your lib dir export不加也行,:-). b.通过/etc/ld.so.conf文件来指定动态库的目录.然后运行ldconfig命令更新搜索共享库的路径.通常这样做就可以解决库无法链接的问题了.此法一劳永逸. c.或者把库文件拷贝到/lib下,然后ldconfig,肯定就行了.:-).这个方法有 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |