问题描述
我有一个相当奇怪的问题,我不知道我是否能够准确描述,但我会尽力而为。我从来没有使用过静态库,所以我在这里没有太多经验。
我有一个代码包,里面有很多用 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 的事实似乎不太合理。
在创建静态库时,是否需要更多步骤才能使一切正常?
为什么与库本身相比,可执行应用程序的大小如此之小?
我无法测试应用程序,因为目标尚未准备好。是否可以运行/测试这样创建的应用程序?
解决方法
当你链接最终的二进制文件时,它不会把静态库中的所有东西都放进去,而只会把它实际需要的东西放进二进制文件中。
因此,如果您在库中有两个(独立的)目标文件,并且您调用了一个函数,那么第二个目标文件中的一个将不会出现在二进制文件中。只有当你也调用它时,它也会复制到二进制文件中。