【问题标题】:How to make COFF from obj file compiled with /GL option?如何从使用 /GL 选项编译的 obj 文件制作 COFF?
【发布时间】:2012-12-11 17:30:45
【问题描述】:

我有一个用一些旧版本的 MSVC 构建的 3d 方静态库,我成功地将它链接到我在 MSVC10 (VisualStudio2010) 中的应用程序。现在我升级到 MSVC11,我无法链接它:

2>LINK:致命错误 C1047:对象或库文件“MyLib.lib”是 使用比其他对象更旧的编译器创建;重建旧对象 和图书馆

我猜这是因为 lib 是使用 /GL 选项编译的,所以目标文件实际上并不包含 COFF,而是一些中间格式。 我没有要重新编译的库源代码,我不想用它制作一个 dll 来动态链接。

有没有办法——也许是一些未记录的技巧——将这些 obj 的“重新编译”到 COFF 并最终将它们链接到 MSVC11 应用程序?

【问题讨论】:

    标签: visual-c++ linker visual-studio-2012 static-libraries coff


    【解决方案1】:

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

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

    【讨论】:

    • 在这种特定情况下,它不会导致任何 ODR 违规。但我不确定我是否理解您的观点:LTCG 的存在与否如何影响 ODR 问题?如果这个库是在没有 LTCG 的情况下构建的,我可以毫无问题地链接它,就像我链接由 GCC 构建的库一样。
    • 我的意思是,即使您能以某种方式解决 LTCG 问题(尽管我不知道有任何方法可以解决此问题),您也会一头扎进 ODR 问题。如果您尝试链接使用 VC10 和 VC11 构建的对象并且都使用 C++ 标准库,您应该会得到一个可爱的链接错误,形式为 dev11object.lib(dev10object.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in dev11object.obj。如果您没有在两个目标文件中使用 C++ 标准库,那么如果您可以解决 LTCG 问题,您可能会有更多选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    相关资源
    最近更新 更多