用静态库链接program时具体链接多少内容?
program调用static library中的一个function foo()但static library的.a文件包括f1.o, f2.o, f3.o,其中f2.o包括了foo()和bar()
在链接program时,.a文件里面的哪些代码被放进了输出可执行文件中了?
是foo(),还是f2.o,还是.a全部? foo()............................ 这个取决于编译器。首先肯定不是.a全部连接的,这个可以肯定。对于GCC一般是以.o为单位的,即你使用了foo(),那么所在.o会全部被连接进目标程序中。VC6.0则是基于函数连接的,即只连接所使用函数的目标代码,所以在VC6.0中可以很方便地自己“重载”库函数,而GCC就会导致冲突。
这个实际上自己做一些程序很容易测试出来的,用编译器加上objdump静态分析一下就很清楚了。 一般来说链接的时候是以.o为单位的;
linux-0gt0:/tmp/test.tmp/1 # cat >1.c
int func1(){return 1;}
int func2(){return 2;}
linux-0gt0:/tmp/test.tmp/1 # cat >2.c
int func3(){return 3;}
int func4(){return 4;}
linux-0gt0:/tmp/test.tmp/1 # cat >3.c
int func1();
main()
{
func1();
}
linux-0gt0:/tmp/test.tmp/1 # cat >Makefile
SRC_LIB=1.c 2.c
SRC=3.c
all:a.out
a.out:3.o lib1.a
gcc 3.c -L. -l1
lib1.a:1.o 2.o
ar rcs $@ $^
linux-0gt0:/tmp/test.tmp/1 # make
cc -c -o 3.o 3.c
cc -c -o 1.o 1.c
cc -c -o 2.o 2.c
ar rcs lib1.a 1.o 2.o
gcc 3.c -L. -l1
linux-0gt0:/tmp/test.tmp/1 # nm a.out | grep func
080483a4 T func1
080483ae T func2
[ 本帖最后由 cjaizss 于 2008-9-6 14:57 编辑 ]
页:
[1]