0

我听说编译器会删除未使用的代码。但是当我包含一个libupnpx.a6 MB 的静态库存档时,这会使应用程序变大 6 MB 吗?或者这与直接包含库源代码一样吗?

4

2 回答 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 回答