我有这个库,其中涉及一些需要在之前运行的静态初始化代码main()
。如果您只是将所有翻译单元编译在一起,那么一切都很好,但是如果我提供静态库(.a
文件)并让用户将他们的应用程序链接到它 - 链接器只是忽略执行静态初始化的符号。
或者,我可以让链接器拾取一切在静态库中,如果我指定-Wl,--whole-archive
GCC 的选项,即指定--whole-archive
GNU 链接选项。
但有中间立场吗?我可以标记一些符号并使链接器始终为可执行文件选择它们,而仅在需要时添加其余符号吗?
动机:我用一些静态块 https://stackoverflow.com/a/39298503/1593077在工厂注册课程;我想让我的代码作为(非动态)库提供,而用户代码不必执行任何“魔法咒语”来填充工厂。
一些相关问题:
- 如何在 C++ 中强制包含静态库中的静态对象 (MSVC 11) https://stackoverflow.com/questions/39336778/how-to-force-include-static-objects-from-a-static-library-in-c-msvc-11
- 如何强制 gcc 从库链接未引用的静态 C++ 对象 https://stackoverflow.com/questions/4767925/how-to-force-gcc-to-link-unreferenced-static-c-objects-from-a-library
您可以强制链接器保留给定的函数(当然,也包括从此函数调用的所有代码)。添加-u my_function
到链接命令。许多构建系统允许静态库将构建设置“导出”给使用它们的人。例如,对于 Androidndk构建框架,你可以指定类似的东西
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)
N.B.为了使这种方法发挥作用,my_function()
不能申报static
。如果某个符号在文件范围内被声明为静态,则链接器猜测根本不知道它的名称。幸运的是,如果链接器决定保留的某些代码中引用了它,那么它也不会被删除。此外,除非你做了一个特别努力 https://stackoverflow.com/a/6770305/192373,链接器将删除或保留整个编译单元(也称为 C 文件)。因此,通常是enough https://developer.android.com/ndk/samples/sample_na.html#mac“锚定”一个虚拟函数来保留许多函数和数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)