选择显示字体大小

linux 编程之生成静态连接库


静态库及动态库的建立
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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons