首页 > 代码库 > 解决mingw动态库在vs下调用 release版本中会出现的奇怪问题

解决mingw动态库在vs下调用 release版本中会出现的奇怪问题


REF | NOREF

/OPT:REF 清除从未引用的函数和/或数据,而 /OPT:NOREF 保留从未引用的函数和/或数据。

默认情况下,LINK 移除未引用的封装函数。 如果对象已经用 /Gy 选项编译过,它包含封装函数 (COMDAT)。 此优化称为可传递的 COMDAT 消除。 若要重写该默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF。 可以使用 /INCLUDE 选项重写特定符号的移除。

如果指定了 /DEBUG,/OPT 的默认项是 NOREF(否则,为 REF),而且所有函数都保留在映像中。 若要重写此默认项并优化调试生成,请指定 /OPT:REF /OPT:REF 选项禁用增量链接。

必须显式地将数据标记为 COMDAT;使用 __declspec(selectany)。

如果指定了 /OPT:REF,默认情况下 /OPT:ICF 处于打开状态。 如果需要 /OPT:REF 而不是 /OPT:ICF,则必须指定下面的内容:

link /opt:ref /opt:noicf

指定 /OPT:ICF 不激活 /OPT:REF 选项。

https://msdn.microsoft.com/zh-cn/library/vstudio/bxwfs976(v=vs.110).aspx



在vs中有下面这样一个选项,当vs调用mingw编译出的.dll.a时文件时,在debug模式下没有问题在release下会有各种奇怪错误,这时候将release模式选项里的上面这个选项关掉就可以了。

许多开源项目比如ffmpeg x264等都只提供mingw平台的编译,而没有提供vs平台的编译。由于vs不支持C99,如果要强行用vs编译,要修改好多错误才能编译通过,工作量大而且改得人头疼。另外每次开源软件更新还要重新再修改一遍。所以在mingw下编译出动态库,然后拿到VS下用感觉是个非常不错的选择,遇到会有上面问题。查了好久没有查到,自己摸索好久摸索出来。(在VS2010下测试通过,其他版本VS未测试)


REF | NOREF

/OPT:REF 清除从未引用的函数和/或数据,而 /OPT:NOREF 保留从未引用的函数和/或数据。

默认情况下,LINK 移除未引用的封装函数。 如果对象已经用 /Gy 选项编译过,它包含封装函数 (COMDAT)。 此优化称为可传递的 COMDAT 消除。 若要重写该默认值并在程序中保留未引用的 COMDAT,请指定 /OPT:NOREF。 可以使用 /INCLUDE 选项重写特定符号的移除。

如果指定了 /DEBUG,/OPT 的默认项是 NOREF(否则,为 REF),而且所有函数都保留在映像中。 若要重写此默认项并优化调试生成,请指定 /OPT:REF /OPT:REF 选项禁用增量链接。

必须显式地将数据标记为 COMDAT;使用 __declspec(selectany)。

如果指定了 /OPT:REF,默认情况下 /OPT:ICF 处于打开状态。 如果需要 /OPT:REF 而不是 /OPT:ICF,则必须指定下面的内容:

link /opt:ref /opt:noicf

指定 /OPT:ICF 不激活 /OPT:REF 选项。


解决mingw动态库在vs下调用 release版本中会出现的奇怪问题