繁体   English   中英

Visual Studio Force库导入C ++

[英]Visual Studio Force Library Import C++

我有两个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();

问题在于,由于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对不可重定位(例如,与/FIXED选项链接)的第三方L.lib (和关联的L.dll )具有传递依赖。 到加载L.dll时 ,由E.exe加载的其他DLL占用了需要加载的固定内存地址。 我需要一种方法来确保尽快加载L.dll ,以防止另一个DLL占用L.dll正常运行所需的内存地址。

只是以一种无法优化的方式获取foo的地址: auto volatile pFoo = &foo; 它实际上没有被调用,但是编译器无法证明它未被调用,因此必须对其进行安全播放。

[edit] Visual Studio显然比LTCG更具侵略性。 添加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名字foo ,但由于存在extern "C"声明,因此我的情况很容易确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM