3

我只是在试验静态和动态库的东西。我制作了两个 .c 文件(比如 file1.c、file2.c)和两个 .h 文件,它们分别包含了一些在其中定义和声明的函数。

我还制作了一个新的 .c 文件,它将调用上述两个 .c 文件中的函数。

如果我使用共享库/静态库,我想检查我得到的可执行文件的大小,所以我从文件 file1 的 .os 制作了一个静态库(libstat.a)和一个共享库(libshar.so)。 c 和文件 2.c。

在将这些库链接到我的主 .c 时,我发现在动态库的情况下可执行文件的大小更大。这不是预期的,对吧?在使用共享库的情况下,库是在运行时加载的,那么为什么它的大小更大?

我正在使用以下命令:

静态库案例

gcc -c file1.c file2.c

ar -cvq libstat.a file1.o file2.o

gcc -o ex1 mainprg.c -L . -lstat

动态/共享库案例

gcc -c -fpic file1.c file2.c

gcc -shared file1.o file2.o -o libshar.so

gcc -o ex2 mainprg.c -L . -lshar

我发现 libshar.so 的大小比 libstat.o 大,而 ex2 的大小比 ex1 大。我希望这个结果是相反的。有人可以解释一下原因吗?

4

1 回答 1

1

多/少多少?如果库中的东西是微不足道的,我不会觉得动态二进制文件使用更多空间而不是静态文件太令人惊讶。动态二进制文件需要包含额外的符号信息和其他元数据以促进运行时链接。静态链接时可以忽略大部分元数据,因此如果库中的函数和/或数据相当小,那可能就是您所看到的。但是,对于具有更多代码和数据的更重要的库,或者当您与许多不同的库链接时,二进制文件应该小得多......

于 2012-08-24T14:27:59.840 回答