当前位置:  技术问答>linux和unix

如何生成.a库文件?

    来源: 互联网  发布时间:2015-09-03

    本文导语:  RT | http://xs.blogchina.com/refer.216235.html 这里有一个简单的例子 | 发信人: hellguard (小四), 信区: Unix         标  题: Re: 如何生成静态连接库?  发信站: BBS 水木清华站 ...

RT

|
http://xs.blogchina.com/refer.216235.html
这里有一个简单的例子

|
发信人: hellguard (小四), 信区: Unix        
标  题: Re: 如何生成静态连接库? 
发信站: BBS 水木清华站 (Fri Nov 12 10:43:42 1999) 

木棉的兄弟给咱解决了,转贴如下,这样就不让后来的兄弟走弯路 

发信人: Loafer (木棉浪子), 信区: Unix 
标  题: Re: 如何生成静态链接库 
发信站: 华南网木棉站 (Thu Nov 11 21:26:08 1999), 转信 

静态库及动态库的建立 
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 



-- 

发信人: hellguard (小四), 信区: Unix        
标  题: 顺便贴个生成linux动态库的 
发信站: BBS 水木清华站 (Fri Nov 12 10:49:03 1999) 

本来格式很好看的,但因为要贴到这里所以 
扭曲了不少,见谅见谅。这里给的是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 testn");  
: 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 worldn" ); 
           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 

|
ar

|
man ar

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c下利用srand和rand函数生成随机字符串
  • 用JBuilder能将java程序生成exe可执行文件吗?如何生成?
  • Linux下c基于openssl生成MD5的函数
  • 我想问一下,java生成的.class文件能不能通过某种工具生成.exe文件?
  • c#如何生成Excel(.xls和.xlsx)文件
  • 高分求jsp中动态生成图片的相关资料、生成svg格式和pdf格式的资料,不够再加分
  • linux下利用(cat,strings,head,sed)命令生成随机字符串
  • 如何使用arm-uclibc-gcc将.c文件编译生成.a,将.c文件编译生成.cgi?
  • php中session_id()函数详细介绍,会话id生成过程及session id长度
  • 如何指定用javac编译生成类的存放路径。(最好不要告诉我再生成之后再把文件流重新到出这种)
  • linux c 生成随机数srand函数和rand函数介绍及代码示例
  • QT Designer生成的代码不能生成可执行程序
  • ORACLE中DBMS_RANDOM随机数生成包
  • 需要从数据库中动态生成的页面是该在SERVLET输出生成,还是应该在JSP编码实现?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • java生成字母数字组合的随机数示例 java生成随机数
  • 请问我用程序如何编辑Adobe Acrobat 5.0的pdf文件(生成报表)啊?或者如何才能将已生成的execl报表转换成pdf格式?
  • 请问用POI生成Excel文件时,怎么能生成边框线条等?
  • php生成短网址 仿微博短网址生成代码
  • 在JB自己生成的EJB客户端的测试代码中都会自动生成,象String url = "t3://localhost:7001";这样的,请问:
  • java随机生成字符串(字符随机生成类 生成随机字符组合)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3