【发布时间】:2019-01-27 03:44:53
【问题描述】:
我有两个 Visual Studio C++ 项目,它们生成以下输出:
L.lib
E.exe
我想在 E.exe 和 L.lib 之间添加一个依赖项,而不实际调用从 L.lib 导出的任何方法. L.lib 导出单个函数:
__declspec(dllexport) unsigned foo();
然后在E.exe中,我有如下编译单元:
// L.cpp
#pragma comment(lib, "L.lib")
extern unsigned foo();
问题在于,由于 E.exe 未使用 foo,因此优化了对 L.lib 的依赖。在不实际执行任何代码的情况下强制依赖 L.lib 的最佳方法是什么?我能想到的最好的方法如下(从上面附加到 L.cpp):
__declspec(dllexport) decltype(&foo) bar{ foo };
但是,以上导致在链接过程中生成额外的文件(E.lib 等),并将公共方法添加到生成的E.exe 可执行文件。谁能想到一个更好的方法来强制进入 EXPORTS 表?
我知道我可以禁用链接器优化以删除未使用的代码,但这会影响整个 E.exe,我不想这样做。
更多信息
我看到的问题是 E.exe 对第三方 L.lib(以及相关的 L.dll) 是不可重定位的(例如,与/FIXED 选项链接)。当 L.dll 被加载时,它需要加载的固定内存地址已被 E.exe 加载的其他 DLL 占用。我需要一种方法来确保尽早加载 L.dll,以防止另一个 DLL 获取 L.dll 正常运行所需的内存地址.
【问题讨论】:
标签: c++ visual-studio dll visual-studio-2015 linker