gpt4 book ai didi

c++ - 链接时, "grab what you need"和 "grab all"(-Wl,--whole-archive) 之间有什么东西吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:50 24 4
gpt4 key购买 nike

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

或者,如果我为 GCC 指定 -Wl,--whole-archive 选项,我可以让链接器获取静态库中的一切,即指定GNU 链接的 --whole-archive 选项。

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

动机:我使用一些 static blocks在工厂注册类(class);我想让我的代码作为(非动态)库提供,而用户代码不必为要填充的工厂执行任何“魔法咒语”。

一些相关问题:

最佳答案

您可以强制链接器保留给定的函数(自然地,从该函数调用的所有代码)。将 -u my_function 添加到链接命令。许多构建系统允许静态库将build设置“导出”给使用它们的人。例如,对于 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)

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

关于c++ - 链接时, "grab what you need"和 "grab all"(-Wl,--whole-archive) 之间有什么东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com