2012-12-11 43 views
2

我有一个用一些老版本的MSVC构建的3D聚会静态库,并且我成功地将它链接到MSVC10(VisualStudio2010)中的我的应用程序。现在我升级到MSVC11,我无法将其链接:如何使用/ GL选项编译来自obj文件的COFF?

2> LINK:致命错误C1047:对象或库文件“MYLIB.LIB”是用旧的编译器比其他对象创建 ;重建旧的对象 和库

我想这是因为的lib与/ GL选项编译,这样的目标文件实际上并不包含COFF,但是一些中间格式。 我没有库源代码来重新编译,我不想让它动态链接的DLL。

有没有一种方法 - 也许一些无证的技巧 - “重新编译”这些obj的COFF,并最终链接到MSVC11应用程序?

回答

1

即使这是可能的,你也不想这样做:链接的目标文件是针对不同版本的CRT构建的,通常会以眼泪结束。更具体地说,如果两个这样的对象文件都使用C++标准库,那么您肯定会违反一个定义规则(ODR)。

如果无法使用Visual C++ 2012重建模块,则应将其封装在使用Visual C++ 2010构建的动态库中,并避免在该DLL的接口中使用任何C++标准库类型。

+0

在这种特定情况下,它不会导致任何ODR违规。但我不确定我是否理解你的观点:LTCG的存在与否是如何影响ODR问题的?如果这个库是在没有* LTCG的情况下构建的,我可以毫无问题地链接它,就像我链接甚至由GCC构建的库一样。 –

+1

我在说,即使你可以以某种方式解决LTCG问题(尽管我不知道有什么办法可以做到这一点),那么你会一头栽进ODR问题。如果尝试链接使用VC10和VC11构建的对象,并且都使用C++标准库,则应该会得到形如'dev11object.lib(dev10object.obj)的可爱链接错误:错误LNK2038:检测到'_MSC_VER'不匹配:值'1600'与dev11object.obj'中的值'1700'不匹配。如果您在两个目标文件中都没有使用C++标准库,那么如果可以解决LTCG问题,则可能会有更多选项。 –

相关问题