我听说编译器会删除未使用的代码。但是当我包含一个libupnpx.a
6 MB 的静态库存档时,这会使应用程序变大 6 MB 吗?或者这与直接包含库源代码一样吗?
问问题
131 次
2 回答
2
答案并不像你想象的那么简单:
让我们做一个实验:
我们将创建一个具有以下结构的 libfoo.a:
生成文件:
LIBOUT=libfoo.a
SRC=foo1.c foo2.c foo3.c
OBJ=$(SRC:%.c=%.o)
default: test1 test2 test3
test1: $(LIBOUT)
$(CC) -o $@ test1.c -L. -lfoo
test2: $(LIBOUT)
$(CC) -o $@ test2.c -L. -lfoo
test3: $(LIBOUT)
$(CC) -o $@ test3.c -L. -lfoo
$(LIBOUT): $(OBJ)
$(AR) ruv $(LIBOUT) $(OBJ)
foo1.c:
#include <stdio.h>
int foo1_service_a() {
printf("Performing foo1_service_a\n");
return 0;
}
foo2.c:
#include <stdio.h>
int foo2_service_a() {
printf("Performing foo2_service_a\n");
return 0;
}
foo3.c:
#include <stdio.h>
int foo3_service_a() {
printf("Performing foo3_service_a\n");
return 0;
}
int foo3_service_b() {
printf("Performing foo3_service_b\n");
return 0;
}
以及三个测试程序:
测试1.c:
int main() {
foo1_service_a();
return 0;
}
测试2.c:
int main() {
foo2_service_a();
return 0;
}
测试3.c:
int main() {
foo3_service_a();
return 0;
}
当我们编译它们时,我们得到:
-rw-r--r-- 1 masud users 285 Aug 3 16:42 Makefile
-rw-r--r-- 1 masud users 96 Aug 3 16:38 foo1.c
-rw-r--r-- 1 masud users 1496 Aug 3 16:39 foo1.o
-rw-r--r-- 1 masud users 97 Aug 3 16:39 foo2.c
-rw-r--r-- 1 masud users 1496 Aug 3 16:39 foo2.o
-rw-r--r-- 1 masud users 173 Aug 3 16:39 foo3.c
-rw-r--r-- 1 masud users 1688 Aug 3 16:40 foo3.o
-rw-r--r-- 1 masud users 5008 Aug 3 16:40 libfoo.a
-rwxr-xr-x 1 masud users 9132 Aug 3 16:43 test1
-rw-r--r-- 1 masud users 45 Aug 3 16:43 test1.c
-rwxr-xr-x 1 masud users 9132 Aug 3 16:43 test2
-rw-r--r-- 1 masud users 45 Aug 3 16:43 test2.c
-rwxr-xr-x 1 masud users 9251 Aug 3 16:43 test3
-rw-r--r-- 1 masud users 45 Aug 3 16:43 test3.c
如您所知,每个 test1 test2 和 test3 都有 foo1.o; foo2.o 和 foo3.o 规定了它们的最终尺寸。
所以档案的内容划分决定了最终二进制文件的大小。
读者练习
当您剥离二进制文件时,大小会发生什么变化?test1 test2 和 test3 大小一样吗?
为什么或者为什么不 ?:)
于 2013-08-03T20:51:20.913 回答
0
您通常可以预期静态链接和“直接包含库源代码”将对生成的可执行文件的大小产生同等影响。在某些小情况下,这可能并不完全正确,但一般来说,它们应该大致相等。
于 2013-08-03T20:13:27.850 回答