请教关于Linux 下静态和动态链接库的几个问题
事情起因:前些天实习的地方要求我做关于linux系统监听进程网络流量的模块,在网上找了nethogs这个工具的源代码,改动了其中一部分来适应我们的具体需求。目前这部分的编码工作已经完成,但是在集成到整个系统中的时候却出现了麻烦:因为nethogs依赖与ncurses,pcap库,测试的时候我机器上安装了这几个包。我们老大要求我给他提交的是一个静态或者动态链接库,这个库打包了所有的源文件(包括依赖的),他自己的机器不用安装任何额外的包。然后我就不知道怎么办了,自己在网上看了好多,还是有很多疑惑,希望大家帮我解答一下,非常感谢:
1.静态链接库是编译阶段包含进来的,动态编译库是运行时加载,那么这二者到底有什么本质的区别,适用于什么场景,我这种情况用哪个比较好。
2.gcc中-L,-I,-lxxxx具体代表的意思是什么,另外gcc -static 和ar做成的静态链接库有什么区别
3.创建动态链接库或者静态链接库的方法中,如何引用这些依赖包(ncurses,pcap),目前已经有了这些库的.so文件,具体如何在makefile中写入
因为英语太差了,看了官方的说明文档,可还是一头雾水,最近也一直在补英语。
各位大哥大姐,帮帮我,实在是没头绪了,非常感谢,
------解决方案--------------------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》此书