我有两个 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();
问题在于,由于 foo
未被 E.exe 使用,因此优化了对 L.lib 的依赖。在不实际执行任何代码的情况下强制依赖 L.lib 的最佳方法是什么?我能想到的最好的是以下内容(从上面附加到 L.cpp):
__declspec(dllexport) decltype(&foo) bar{ foo };
但是,上述结果会在链接过程中生成额外的文件(E.lib 等),并将公共(public)方法添加到生成的 E.exe< 的 EXPORTS 表中/em> 可执行文件。谁能想到一种更好的方法来强制进入 EXPORTS 表?
我知道我可以禁用链接器优化以删除未使用的代码,但这会影响整个 E.exe,我不想这样做。
更多信息
我看到的问题是 E.exe 对第三方 L.lib(以及关联的 L.dll) 是不可重定位的(例如,与 /FIXED
选项链接)。到加载 L.dll 时,它需要加载的固定内存地址已被 E.exe 加载的其他 DLL 占用。我需要一种方法来确保尽早加载 L.dll,以防止另一个 DLL 占用 L.dll 正常运行所需的内存地址.
最佳答案
只需以无法优化的方式获取foo
的地址:auto volatile pFoo = &foo;
。它实际上并没有被调用,但编译器无法证明它没有被调用,所以它必须谨慎行事。
[编辑]
使用 LTCG,Visual Studio 显然比我想象的更激进。添加 pFoo=pFoo;
修复它。链接器映射:0003:0000037c ?pFoo@@3R6AXXZA 0040337c
关于c++ - Visual Studio Force 库导入 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51940448/