2017-08-03 31 views
-1

从Visual Studio 2010到2015最近更新了一个项目,我们遇到了一个奇怪的链接时问题。Visual C部队未使用的导入,由图书馆拉入

我们为amd64和x86以及调试和发布模式构建我们的项目。 该项目有2个依赖项,我们称之为libAlibB。 我们有一些自定义的构建后脚本,对二进制文件进行一些验证(例如检查NX和SEH标志等)。 使用此脚本,我们还验证导入的DLL及其导入的函数,以尽可能少地保持静态导入,并尝试通过动态加载(为了向后兼容)来解决额外的问题。

迁移后,我们设法建立在每一个可能配置的一切,但在DEBUG模式(在仅调试模式)生成的二进制文件 - 由于在存在代码力霸 - 拉在一些进口 - 让我们将其称为dllA - 实际上未使用,因此不希望存在。 libB引入没有问题 - 虽然它是一个非常简单的库。

为什么力霸在是因为它是一个多用途库,通过一些其他项目使用,它有一些代码,从调用函数DLLA拉动这些进口,但在我们的项目我们之所以根本不要调用那些dllA-export-calling-functions。 我也用IDA反汇编了dll,发现这些函数都在二进制文件中,与二进制代码中的其余代码完全断开 - 它们根本没有被引用。

经过一番摸索,并试图将RELEASE版本力霸的链接到我们的DEBUG建立我们的项目,我发现,从DLLA进口不再被拉入,使得我想,图书馆配置可能是问题。 我使用了库的调试和发布版本的命令行参数,并且将它们并排比较,以找出配置的差异。 我对针点管理的问题,以优化设置(优化选项卡上):

  • 调试模式,它在默认情况下
  • 设置为Disabled(/OD)的发布模式,它是设定为最大速度(/O2
  • 设置最大化速度(/ O2)DEBUG模式需要照顾的问题 - DLLA不再进口

我的问题是,这对于调试是非常直观的,因为编译器会优化太多的东西,可能会使调试更加困难。

发布之前,我环顾四周随处可见,还研究了在我们的主要项目的连接器 - >优化页面,而参考选项设置为是(/ OPT:REF),应避免链接未使用的代码,但在我看来,VS2015在调试版本中完全忽略了这个设置。

+0

重复评论 – user2281752

回答