【问题标题】:Error C1047: Object file created with an older compiler than other objects错误 C1047:使用比其他对象更旧的编译器创建的对象文件
【发布时间】:2010-10-24 15:18:00
【问题描述】:

我有一个项目,我在 Windows 7 上的 Visual Studio 2008 SP1 的发布模式下用 C++ 构建,当我构建它时,我不断得到:

致命错误 C1047:对象或 库文件'.\Release\foobar.obj' 使用较旧的编译器创建 比其他物体;重建旧 对象和库。

链接时发生错误。

我已经尝试删除特定的目标文件并重建,但这并不能解决问题。我也试过吹走整个发布构建文件夹并重建,但这也没有解决它。有什么想法吗?

【问题讨论】:

    标签: c++ visual-studio-2008


    【解决方案1】:

    我遇到了这个问题,但我的解决方案不同:

    对我来说,罪魁祸首是一个包含的外部库是用

    编译的
    /GL (=Enable link-time code generation under
          C/C++/ Optimization / Whole Program Optimization) 
    

    使用较旧的视觉工作室 (2005)。我在 2005 年在没有 /GL 的情况下重建了所述库,并且链接器错误在 2008 年消失了。正如 MSDN 所述,它与 /LTCG 设置有关,这是由 /GL 标志自动设置的: http://msdn.microsoft.com/en-us/library/ms173554%28v=vs.80%29.aspx

    【讨论】:

    • 我在构建第三方库时遇到了这个问题。不幸的是,我找不到从命令行禁用 WholeProgramOptimization 的简单方法。编辑 vcproj 后,在任何地方将此选项设置为 false,它起作用了。
    • 是的,这也清楚地记录在 here 中,其中指出“使用 /GL(整个程序优化)编译器开关编译的静态库或目标文件不是跨版本的二进制兼容”。我建议您将此链接也添加到答案中。
    【解决方案2】:

    我建议重新安装 VS 2008 SP1。您是否同时安装了不同的 VS(例如 VS Express)?众所周知,这会干扰现有的 VS 安装。

    您可以尝试通过在 Visual Studio 命令提示符下运行 cl.exelink.exe 来检查编译器和链接器版本。

    【讨论】:

    • 我通过重新安装 VS2008 SP1 解决了这个问题。发生的事情是我安装了 VS2008,然后是 SP1,然后是 Feature Pack。这在编译器中造成了不一致,并且重新安装 SP1 修复了它。
    • 很高兴您再次启动并运行!似乎发生的事情是,您用于创建对象的工具(稍微)比编译器提供的链接到的对象旧。
    • 我也遇到了同样的错误,但重新安装并不能解决问题。我清理并重建了项目,该错误消失了。
    【解决方案3】:

    我能够通过以下步骤在 VS 2015 中解决此问题。

    [1](不确定是否有必要)关闭所有组件中的 /GL

    C/C++ > 优化 > 整个程序优化 > 否

    在 .VCXPROJ 文件中是:

    <WholeProgramOptimization>false</WholeProgramOptimization>
    

    关闭 /LTCG

    图书管理员 > 常规 > 链接时间码生成

    <LinkTimeCodeGeneration>false</LinkTimeCodeGeneration>  
    

    [2] 更重要的一步,确保所有组件都来自相同的目录。我的主要 EXE 正在使用:

    Release Include
    $(WindowsSdkDir)include\um;$(WindowsSdkDir)include\shared;$(UniversalCRT_IncludePath);$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include
    Release Library
    $(VC_LibraryPath_x86);$(WindowsSdk_71A_LibraryPath_x86);
    

    .lib 使用不同的目录(错误):

    Release Include
    $(VC_IncludePath);$(WindowsSDK_IncludePath);
    Release Library
    $(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86
    

    我把.lib目录改成和.exe一样,编译错误消失了。

    【讨论】:

    • 关闭 LinkTimeCodeGeneration 和 WholeProgramOptimation 对我有用!非常感谢!
    【解决方案4】:

    两种方式:

    1.更新到Sp1以构建lib

    2.请检查您的构建以确保禁用整个程序优化。对于静态库项目,进入属性页,将“Configuration Properties->C/C++->Optimization->Whole Program Optimization”改为“No”。

    【讨论】:

    • 另外,将_MSC_VER=XXXX二进制替换为旧lib文件中所需的版本可能会有所帮助。
    【解决方案5】:

    任何人找到这个线程来寻找答案......我也遇到过这个问题,但它不是 SP1 问题、重建问题或 PCH 问题......它最终成为一个使用更新版本的 VS 试图链接到旧 VS 上的项目。虽然这听起来很明显,但奇怪的是 VS2008 报告说它编译的对象是导致问题的原因,这让我大吃一惊......

    【讨论】:

    • 这也发生在我身上,罪魁祸首是 tinyxml2.lib,结果我真的不需要它,所以我从项目配置中删除了它,问题就消失了。非常感谢@mark。
    【解决方案6】:

    也可能是有问题的库是使用不同的“平台工具集”设置构建的(在项目属性->常规中)。

    【讨论】:

    • 这应该是评论,而不是答案。
    • 不同意。正是我的情况的根本原因。
    【解决方案7】:

    我也遇到了同样的问题,我的 Visual Studio About 框报告我安装了 SP1。显然这并不完全正确。对我具体出现此问题的调查揭示了资源编译器似乎是罪魁祸首。它碰巧是旧版本,导致提到的错误消息。我安装的修补程序(Windows 更新)没有解决这个问题。也许我错过了一个关键的......

    希望我们曾经体验过开发人员在生成的错误消息中真正传达真正问题的那一天。 :-) '一个旧版本的编译器......'来吧伙计们,你可以做得更好;-)

    无论如何,这里是我用来解决这个问题的 VS2008 的最新 SP1 的下载链接。

    http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyId=FBEE1648-7106-44A7-9649-6D9F6D58056E&displaylang=en

    编码愉快。

    【讨论】:

      【解决方案8】:

      我在这里尝试了所有东西......我的错误变成了一个错误的参考和重复的 GUID(在 2010 年和 2015 年项目之间......复制/过去项目的地狱)

      在项目从 VS2008 迁移到 2010 和 2015 期间。我们保留所有项目版本 XXX.vxproj(适用于 VS2010)和 XXX_2015.vxproj(适用于 VS2015)。

      在其中一个 2015 年的解决方案中,我们得到了 2010 年项目的参考!

      所以检查 REFERENCE... 并且永远不要重复 GUID。

      【讨论】:

        【解决方案9】:

        我遇到了同样的问题,但是直接重新安装并没有解决它。我使用的是我在这里找到的版本

        https://www.dreamspark.com/Products/Product.aspx?ProductId=9

        但是,在搜索论坛后,我发现安装 VS2008 SP1 Express 可以消除这个问题。 . . .

        http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&FamilyID=f3fbb04e-92c2-4701-b4ba-92e26e408569

        您必须注意从哪个位置下载 VS2008,因为可以下载同一 Express 产品的不同版本。

        【讨论】:

          【解决方案10】:

          参考MSDN,这个错误 对象或库文件“file”是使用比其他对象更旧的编译器创建的;重建旧对象和库 当使用 /LTCG 构建的目标文件或库链接在一起时,会导致这些目标文件或库是使用不同版本的 Visual C++ 工具集构建的。
          如果您开始使用新版本的编译器,但没有对现有目标文件或库进行干净的重建,则可能会发生这种情况。
          要解析,重建所有目标文件或库。

          【讨论】:

            【解决方案11】:

            检查项目目录中是否有.pch(预编译头文件)文件并将其删除。然后重建项目。
            获得干净构建的最佳方法是使用 Build->Clean 或 Build->Rebuild All

            编辑:您可以尝试的另一件事几乎是万无一失的,那就是仅从源文件在新目录中重新创建项目文件。
            如果可行,那么您可以逐步将旧项目与新项目进行比较,看看哪里出了问题。

            【讨论】:

              猜你喜欢
              • 2022-01-07
              • 1970-01-01
              • 2016-04-07
              • 2017-05-12
              • 2015-03-12
              • 1970-01-01
              • 2021-07-24
              • 1970-01-01
              • 2013-07-19
              相关资源
              最近更新 更多