c++ - Visual Studio Force 库导入 C++

标签 c++ visual-studio dll visual-studio-2015 linker

我有两个 Visual Studio C++ 项目,它们生成以下输出:

L.lib
E.exe

我想在 E.exeL.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/

相关文章:

java - 从 Java 将窗口置于最前面

python - 强制 ctypes.cdll.LoadLibrary() 从文件重新加载库

c++ - 我可以创建一个 C++ "zap"函数来处理一个指针,如果它没有分配内存吗?

c++ - 删除注释的 C++ 程序

c++ - 射线柱相交

c# - Visual Studio 2013 Desktop 中没有下拉列表控件

visual-studio - Visual Studio 2010 在调试 C++/CLI(混合模式)项目期间挂起

c++ - 这样使用嵌套 vector/multimap/map 可以吗?

visual-studio - 为什么 "Export to New Stream Analytics Project"被禁用

dll - Azure:在工作角色中使用框架/SDK(带有 .dll)的最佳实践