创建静态库并将其链接到另一个项目与库相比较小的应用程序大小

问题描述

我有一个相当奇怪的问题,我不知道我是否能够准确描述,但我会尽力而为。我从来没有使用过静态库,所以我在这里没有太多经验。

我有一个代码包,里面有很多用 C 创建的文件,当然还有头文件。我预先创建了一个 MakeFile 来将生成代码编译成一个静态库。这个 MakeFile 的结构非常简短:

# makeLibrary.mk
# File       : Makefile for the static library 
#
GOAL    :=                  someName
BUILD   :=                  library
LIBTYPE :=                  static

SOURCES :=                  \
        file1.c             \
        file2.c             \
        file3.c             \
        file4.c             \
        file5.c             \
        file6.c 
CFLAGS  :=                  someFlags 
DEFInes :=                  someDefines 
INCLUDE_PATH := \
    ../export   
INSTALL_DIR        := ../releases/${ARCH}
HEADER_INSTALL_DIR := 
HEADER_FILES       := 

这会导致创建文件:file1.o、file2.o、...、file6.o 和一个主库文件:libsomeName.a。 libsomeName.a 文件大约为 614KB,这正是我所期望的。 到目前为止,我一切正常。

然后我需要将此库文件附加到我的项目中。 要创建一个可执行应用程序,我需要另一个 MakeFile,所以我创建了一个。这个 MakeFile 的结构看起来更像这样:

# makeApplication.mk
# File       : Makefile for the executable application
#
GOAL    :=              executableApp
BUILD   :=              application
SOURCES :=              \
        myFile_main.c       

CFLAGS  :=              someFlags 
DEFInes :=              someDefines 

因为我想包含一个以前创建的库,所以我在这个 makeApplication.mk 中定义它:

# Additional libraries,created in prev. makeLibrary.mk
STATLIBS := \
         someName

由于创建的库和头文件在不同的文件夹中,我定义了这些文件的位置:

#Library header file localization
INCLUDE_PATH := \
    ../../../export   
#Library file localization
LIBRARY_PATH := \
    ../../../releases/$(ARCH)

我认为到目前为止一切都很好。

现在我的问题开始了,我不确定我是否理解正确。我想在 myFile_main.c 文件中使用添加libsomeName.a 静态库的函数。 因此,为此,我需要在属于库的 myFile_main.c 文件添加文件

#include "file1.h"
#include "file2.h"
#include "file3.h"
#include "file4.h"
#include "file5.h"
#include "file6.h"

...
//Here is some code where I use functions defined in the static library. The prototypes for these 
//functions are in the header files,of course.
...

所有代码都正确编译,没有任何错误和警告。但是创建的内容(可执行应用程序)让我有点担心。可执行App文件只有13KB。 看看包含的库是 614KB 的事实似乎不太合理。

在创建静态库时,是否需要更多步骤才能使一切正常?

为什么与库本身相比,可执行应用程序的大小如此之小?

我无法测试应用程序,因为目标尚未准备好。是否可以运行/测试这样创建的应用程序?

解决方法

当你链接最终的二进制文件时,它不会把静态库中的所有东西都放进去,而只会把它实际需要的东西放进二进制文件中。

因此,如果您在库中有两个(独立的)目标文件,并且您调用了一个函数,那么第二个目标文件中的一个将不会出现在二进制文件中。只有当你也调用它时,它也会复制到二进制文件中。