在/usr/lib和/lib目录中可以找到绝大多数的共享库。连接时将首先搜索这两个目录。有一
些库也可能存放在特定的目录中,在/etc/ld.conf配置文件中给出了这些目录的列表。连接程序
也会对列出的这些目录进行搜索。在默认情况下,Linux将首先搜索指定库的共享版本,如果找
不到,才会去搜索静态版本。在对共享库进行更新或安装新库后,必须运行ldconfig命令更新
/etc/ld.conf文件中相应的项(如果使用RPM进行安装,一般会自动进行更新,不过也不能保证
这一点)。
在gcc编译器中引用可搜索到的目录中的库文件时,需要使用-l选项和库名。在gcc命令行上
输入-lm可以在程序中连接标准算术库,-l将首先使用libname.so进行搜索,这里是libm.so。下
面的例子将使用算术库创建bookrecs程序,请注意这里的-lm选项。
$ gcc main.c io.c -o bookrecs -lm
系统中还有一些其它可用的库,常用的是libncurses.a库,包含了一些简单的鼠标移动例程。
在命令行中使用-lncurses选项引用libncurses.so库。下面的例子同时调用了数学和光标库。
$ gcc mian.c io.c -o bookrecs -lm -lncurses
在引用其它目录中的库时,需要使用-ldir选项指定该目录。该选项指定了搜索库函数时其
它路径。在下面的例子中,用户在连接时使用了mydir目录中的myio.so库文件。
$ gcc main.c -o bookrecs -lmydir -lmyio (http://www.fanqiang.com)
a的是为了支持较老的a.out格式的可执行文件的
.so的是支持elf格式的可执行文件的库。
静态库是指编译连接时,把库文件的代码全部加入到可执行文件中,所以生成的文件较大,
但运行时,就不再需要库文件了。动态库正好相反,在编译连接时,没有把库文件的代码加入
到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件
.a是静态库文件,可以用ar 命令生成。
.so是动态库文件,编译时加上指定的选项即可生成,具体选项看相应的系统文档了。。。。
IBM AIX下如下:
$(CC) $(SHOPT) $(SHLIBS) a.o b.o -o lib$@$(DBBUILDTAIL)
假设你有test1.c test2.c test3.c , 编写成动态链接库
1. 先编译成test1.o test2.o test3.o
2. gcc -shared -W1, -soname,libvTest.so.1 -o libvTest.so.1.0 *.o
我给你一篇文章吧,是IBM公司的人写的,我就是照着里面做的,另外你可以采用C++的方
式写,然后再套一层C写SO,最后可供外部以C的方式调用。还有一种方法就是将C++编写的SO
以C++的方式提供给外界使用,就是在外部程序中引入类的声明及变量实例,就好象外部程序
也是其中一部分一样。
|