BBS水木清华站∶精华区

发信人: 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 
 
-- 
 
            也许有一天,他再从海上蓬蓬的雨点中升起, 
            飞向西来,再形成一道江流,再冲倒两旁的石壁, 
            再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生...... 
 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 203.207.226.124] 

BBS水木清华站∶精华区