静态库及动态库的建立
unix系统及各种软件包为开发人员提供了大量的库文件。但一般情况下这些库文件还 不能足以满足用户的所有需求。开发人员大多会根据他们自己的开发、研究要求编写 出许多函数。对于这些函数,如果都用在命令行中指定源文件的方法同调用它们的程 序链接起来,虽然也是可以的,但也有一些缺点:
.....
下面来看看如何生成静态库。
我们知道静态库也称档案库,在此档案文件中实际上是收集了一系列的目标文件。这 些目标文件就是由cc(gcc)函数的源代码编译生成的。因此,静态库的生成方法实际上 可以分成两步:
1.将各函数代码所在的源文件编译成目录文件。例如,对于myfunc.c,可以用如下命令 将其编译成目标文件:
gcc -c myfunc.c
当然在有多个源文件时,只需在gcc 命令行中将其分别列上就可以了。 经此一步我休养将能够得到各源文件的目标文件。对上例,将得到myfunc.o
2.将各目标文件收集起来放到一个静态库文件中。这主要借助于ar命令完成,如:
ar r ~/lib/libtest.a myfunc.o
建立动态链接库、并不需要用到其他的工具,借助于gcc命令即可完成。此时需在命令 行中加上-k pic和-g这两个选项,如下我们可以建立libtest的动态版本:
gcc -k pic -g -o $home/lib/libtest.so myfunc.c
--
本来格式很好看的,但因为要贴到这里所以 扭曲了不少,见谅见谅。这里给的是linux下的例子, 但是solaris下的也差不多.
ldd filename就可以看到程序用到哪些库。
ld -o output /lib/crt0.o hello.o -lc
ld将输出最终结果文件 output ,
用到/lib/crt0.o hello.o以及libc.a
libc.a来自标准库搜索路径,请参看-l选项的讨论
ld的选项顺序任意,可以重复,后面的将覆盖前面的。
gcc -c -fpic linuxlib.c -o3 -o linuxlib.o
gcc -shared -wl,-soname,liblinuxlib.so.1 \
-o3 -o liblinuxlib.so.1.0 linuxlib.o
(
ld -m elf_i386 -shared -o liblinuxlib.so.1.0 \
-soname liblinuxlib.so.1 linuxlib.o
这个语句产生的文件更小,不知道二者有何区别
-o liblinuxlib.so.1.0 这个文件名任意,关键是后面
两个符号连接要正确
当然推荐使用有意义的带版本信息的名字,包括
-soname liblinuxlib.so.1
)
ln -sf liblinuxlib.so.1.0 liblinuxlib.so.1
(
运行时,dynamic linker根据 -soname \
liblinuxlib.so.1 去寻找liblinuxlib.so.1
)
ln -sf liblinuxlib.so.1 liblinuxlib.so
(
编译的最后一个步骤,ld命令根据 -llinuxlib
选项去寻找liblinuxlib.so
)
export ld_library_path=.
(
编译时、运行时都需要这个变量的存在
编译时如果不存在这个变量,编译依旧通过,但
用ldd查看会发现没有动态连接信息
运行时如果不存在这个变量,将报告无法找到动态连接库
这个变量如果不用相对路径".",换了运行环境就比较麻烦
export ld_library_path=`pwd`:$ld_library_path
)
gcc -l. -lbsd -llinuxlib -o3 -o linuxkiller linuxkiller.c
(
-l. 指出除标准库搜索路径之外的库搜索路径,如果不指
定,将找不到liblinuxlib.so
这个选项并不能代替 ld_library_path 变量,否则虽然编译通过,
但用ldd linuxkiller的时候会发现没有动态连接信息
)
可以把自己的动态连接库放到/usr/lib或者/lib下去,或者
修改/etc/ld.so.conf
然后利用/sbin/ldconfig。具体请man ldconfig
--
发信人: hellguard (小四), 信区: unix
标 题: re: help :static library----what's wrong--thanks.
发信站: bbs 水木清华站 (thu aug 16 14:22:39 2001)
【 在 hululu (呼噜噜~回家中) 的大作中提到: 】
: i am building a static library. but i do not know what is
: wrong. below is a sample:
: tt.c:
: #include
: int func(){
: printf("func test\n");
: return 0;
: }
: ii.c:
: #include
: extern int func();
: ...................
★ 生成静态链接库举例
1. vi demo.h
void demo ( void );
vi demo.c
#include
#include "demo.h"
void demo ( void )
{
printf( "hello world\n" );
return;
}
2. g++ -wstrict-prototypes -wall -wunused -o3 -c demo.c -o demo.o
file demo.o
3. ar -rsv libdemo.a demo.o
a - demo.o
file libdemo.a
nm -s libdemo.a
ar -tv libdemo.a
4. vi scz.c
#include
#include "demo.h"
int main ( int argc, void * argv[] )
{
demo();
return 0;
}
5. g++ scz.c -l. -ldemo -wstrict-prototypes -wall -wunused -o3 -o scz
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器