快速业务通道

linux下编译自己的库文件实践

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-20
的取巧,且破坏原库文件的纯洁性,不应是方法.

  当然修改/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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号