gpt4 book ai didi

visual-c++ - 可执行导出符号但未导出,因为它们未被可执行文件本身引用

转载 作者:行者123 更新时间:2023-12-02 17:31:18 25 4
gpt4 key购买 nike

我有一个特殊的用例,其中可执行文件需要导出某些符号,这些符号由可执行文件在运行时加载的动态加载的 DLL 导入和使用。

可执行文件与一些静态库链接,这些静态库实际上具有导出的符号,而 DLL 使用这些静态库 header 导入这些符号。

如果可执行文件中未使用或未引用这些符号,则链接器会删除它们,因此它们不会导出,因此在加载时不可用于 DLL。

我在 GCC/clang 上分别使用 --whole-archive 和 -force_load 选项解决了这个问题。

Windows 上的 MSVC 怎么样?我使用 __declspec(dllexport) 和 __declspec(dllimport) 在 Windows 上导出和导入符号。

编辑:对于代码引用,您可以在此处找到代码:https://github.com/hunkabhicupid/exeexport

问题与这些帖子类似 1 , 2但是这些帖子的答案并没有帮助我找到解决方案,或者我觉得它们没有用。

最佳答案

问题:在 Windows 上,STATIC LIB 包含一个 OBJ 文件,该文件具有标记为 __decl-spec(dll¬export) 的函数,但如果在 EXE 中未使用该函数,则该函数不会从 EXE 中导出。在其他平台上我们也有同样的问题,但是我们有编译器选项,比如 --whole-archive/-force_load,让它工作。

链接: Link1 Link2

我想到的唯一解决方案是不创建静态库,而是将所有代码(静态库)包含在可执行文件中,然后:1. 它适用于 Windows2. 它在没有 --whole-archive 的 Linux 上工作3. 它可以在没有 -force_load 的 Mac OS X 上运行4. 我们也不必担心2 & 3 是否包含死代码、exe 膨胀等。

这是唯一的解决方案,直到链接器变得聪明并丢弃所有未使用的符号,除了那些专门标记为外部使用的符号,即标记为导出的符号。

关于visual-c++ - 可执行导出符号但未导出,因为它们未被可执行文件本身引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32987041/

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