Visual Studio Force Library导入C ++

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Visual Studio Force Library导入C ++相关的知识,希望对你有一定的参考价值。

我有两个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表中。谁能想到一种更好的方法来强制进入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

另一答案

虽然MSalters的回答在90%的情况下有效,但它总是无法从E.exe添加对L.lib的引用。此外,他编辑的建议需要修改可执行文件使用的函数体。我一直在寻找一种解决方案,只需要包含一个发送到链接器的附加源文件(编译单元)。

经过进一步调查,我确定以下代码完全符合以下条件:

// L.cpp
#pragma comment(lib, "L.lib")
extern "C" unsigned foo();
#pragma comment(linker, "/include:_foo")

这迫使你知道foo的错误名称,但由于extern "C"声明,我的情况很容易确定。

以上是关于Visual Studio Force Library导入C ++的主要内容,如果未能解决你的问题,请参考以下文章

卸载 Visual Studio 2013 Update 3 时卡住

无法卸载 Visual Studio 2015(存储控制块被破坏)

在 android 中集成 org.apache.poi 和 javax.xml.stream.* 包 (stax-api) - 如何在 Android Studio 中设置 --core-libra

visual studio怎么替代IAR

无法找到visual studio 2017生成工具

dev文件用visual studio怎么打开