c – 链接时,“抓住你需要什么”和“抓住所有”(-Wl, – 整个档案)之间有什么东西?

我有这个库涉及一些需要在main()之前运行的静态初始化代码.如果您只是将所有翻译单元编译在一起,这一切都很有效,但是如果我提供一个静态库(.a文件)并让用户将其应用程序链接到它,它就无法工作 – 链接器只是忽略了我的符号静态初始化.

另外,如果我为GCC指定-Wl​​, – whole-archive选项,即指定GNU链接的–whole-archive选项,我可以使链接器接收静态库中的所有内容.

但是有一些中间立场吗?我可以标记一些符号并使链接器始终为可执行文件选择它们,而其他符号仅在需要时添加吗?

动机:我用一些static blocks在工厂注册课程;我希望将我的代码作为(非动态)库提供,而不需要用户代码执行任何“魔术咒语”来填充工厂.

一些相关问题:

> How to force include static objects from a static library in C++ (MSVC 11)
> How to force gcc to link unreferenced, static C++ objects from a library
> How to force gcc to link an unused static library

最佳答案 您可以强制链接器保留给定的函数(当然,所有从此函数调用的代码).将-u my_function添加到link命令.许多构建系统允许静态库将构建设置“导出”给使用它们的人.例如,对于Android ndk-build框架,您可以指定类似的内容

include $(CLEAR_VARS)
LOCAL_MODULE := the_best_static_library
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_LDFLAGS := -u my_function
include $(PREBUILT_STATIC_LIBRARY)

在您的模块Android.mk中.人们通过在Android.mk中添加简单的语句来重用它

$(call import-module,third_party/the_best_static_library)

注:要使这种方法起作用,my_function()不能声明为static.如果某个符号在文件范围内声明为静态,则链接器根本不会知道它的名称.幸运的是,如果在链接器决定保留的某些代码中引用它,那么它也不会被剥离.此外,除非您创建special effort,否则链接器将剥离或保留整个编译单元(a.k.a. C文件).因此,通常enough“锚定”虚拟函数以保持许多功能和数据.

点赞