日期:2014-05-16  浏览次数:20680 次

请教关于Linux 下静态和动态链接库的几个问题
事情起因:前些天实习的地方要求我做关于linux系统监听进程网络流量的模块,在网上找了nethogs这个工具的源代码,改动了其中一部分来适应我们的具体需求。目前这部分的编码工作已经完成,但是在集成到整个系统中的时候却出现了麻烦:因为nethogs依赖与ncurses,pcap库,测试的时候我机器上安装了这几个包。我们老大要求我给他提交的是一个静态或者动态链接库,这个库打包了所有的源文件(包括依赖的),他自己的机器不用安装任何额外的包。然后我就不知道怎么办了,自己在网上看了好多,还是有很多疑惑,希望大家帮我解答一下,非常感谢:

1.静态链接库是编译阶段包含进来的,动态编译库是运行时加载,那么这二者到底有什么本质的区别,适用于什么场景,我这种情况用哪个比较好。

2.gcc中-L,-I,-lxxxx具体代表的意思是什么,另外gcc -static 和ar做成的静态链接库有什么区别

3.创建动态链接库或者静态链接库的方法中,如何引用这些依赖包(ncurses,pcap),目前已经有了这些库的.so文件,具体如何在makefile中写入

因为英语太差了,看了官方的说明文档,可还是一头雾水,最近也一直在补英语。

各位大哥大姐,帮帮我,实在是没头绪了,非常感谢,
linux?c语言

------解决方案--------------------
gcc 链接的时候用-static就可以了吧
$ cat Makefile

all: demo_d demo_s

demo_d:
        gcc -o $@ demo.c         -lncurses

demo_s:
        gcc -o $@ demo.c -static -lncurses

clean:
        rm -f demo_s demo_d

$ make
gcc -o demo_d demo.c         -lncurses
gcc -o demo_s demo.c -static -lncurses

$ file demo_d demo_s
demo_d: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
demo_s: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, statically linked, for GNU/Linux 2.6.9, not stripped

$ ldd demo_d demo_s    
demo_d:
        linux-gate.so.1 =>  (0x00751000)
        libncurses.so.5 => /usr/lib/libncurses.so.5 (0x0457b000)
        libc.so.6 => /lib/libc.so.6 (0x00a0a000)
        libdl.so.2 => /lib/libdl.so.2 (0x00b7b000)
        /lib/ld-linux.so.2 (0x009ec000)
demo_s:
        not a dynamic executable

------解决方案--------------------
建议系统学习《程序员的自我修养—链接、装载与库.pdf》此书