【问题标题】:Creating and linking a static library to another project. Small application size compared to the library创建静态库并将其链接到另一个项目。与库相比,应用程序较小
【发布时间】:2021-05-01 10:34:52
【问题描述】:

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

我有一个代码包,其中包含许多用 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.
...

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

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

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

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

【问题讨论】:

    标签: c++ c gcc makefile static-libraries


    【解决方案1】:

    当您链接最终的二进制文件时,它不会获取静态库中的所有内容,而是仅将其实际需要的内容放入二进制文件中。

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

    【讨论】:

    • 有点复杂。删除“死代码”,您需要更多标志。但通常是的,它只会链接需要的东西
    • 所以如果我理解正确,如果在整个创建的库中大约有 1k 个函数,但在文件 myFile_main.c 中我只使用了几个(+/-20),因为它只是内核初始化在最终的可执行文件中通常只包含 +/- 20 个函数,这就是为什么大小如此“小”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多