【问题标题】:Visual C++. LNK2011: precompiled object not linked in. But I linked视觉 C++。 LNK2011:未链接的预编译对象。但我链接
【发布时间】:2021-02-05 11:17:37
【问题描述】:

我第一次尝试使用预编译的头文件。使用命令行。就是这样:

cl /Yu"pch.h" src/main.cpp src/shader.cpp src/camera.cpp /std:c++17 /MT -EHsc glfw3.lib glew32.lib GlU32.lib OpenGL32.lib -I include /link "pch.obj" /LIBPATH:"C:\Users\yuryi\Desktop\C++\CMDOGL\lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /OUT:"C:\Users\user\Desktop\C++\CMDOGL\a.exe" /MACHINE:X64 /nologo

但它会打印:pch.obj : LNK2011: precompiled object not linked in. image may not run。我无法弄清楚如何链接它。我想我是使用 /link "pch.obj" 做到的。注意:/Yc"pch.h" 成功

文件结构:

 - main.cpp
 - pch.cpp
 - pch.h
 - shader.cpp
 - shader.h
 - camera.cpp
 - camera.h

pch.cpp 就是 #include "pch.h"。 pch.h 包括项目所需的一切。所有其他文件仅包含 pch.h

我尝试过的事情:

  1. 谷歌搜索 2 小时(MS 文档等)
  2. 以不同方式调整命令行

【问题讨论】:

  • 看起来pch.cpp不在列表中:src/main.cpp src/shader.cpp src/camera.cpp
  • 好吧。它修复了这个确切的错误,但现在我有不一致的错误src/camera.cpp(1): fatal error C1854: cannot overwrite information formed during creation of the precompiled header in object file: 'C:\Users\user\Desktop\C++\CMDOGL\camera.obj'(有时与 shader.cpp)。我想这个问题已经结束了
  • 我的建议是进入您的项目设置并完全禁用预编译头文件。然后从所有源文件中删除#include "pch.h"。当您没有 10,000 行代码和/或许多大型外部 3rd 方库依赖项时,这是最好的。预编译的头文件并不能真正帮助学术作业中使用的典型项目。如果有的话,它们会导致此类小型项目的构建时间增加。
  • @natovan 你必须先用/Yc 编译pch.cpp,然后用/Yu 编译其他CPP,然后是link all。
  • @dxiv 您的评论比其他任何评论都更有帮助。我添加了 bat 文件来自动化几个 cmd,现在我的编译速度非常快!

标签: c++ visual-c++ command-line linker precompiled-headers


【解决方案1】:

我通过这一系列命令解决了这个问题:

cl /c /Yc"pch.h" src/pch.cpp /std:c++17 /MT -EHsc -I include /link /nologo
cl /c /Yu"stdafx.h" src/main.cpp /std:c++17 /MT -EHsc -I include /link /nologo
cl /c /Yu"stdafx.h" src/camera.cpp /std:c++17 /MT -EHsc -I include /link /nologo
cl /c /Yu"stdafx.h" src/shader.cpp /std:c++17 /MT -EHsc -I include /link /nologo

对于使用预编译头文件快速编译源文件:

cl /Yu"pch.h" src/main.cpp src/shader.cpp src/camera.cpp /std:c++17 /MT -EHsc glfw3.lib glew32.lib GlU32.lib OpenGL32.lib -I include /link /out:a.exe stdafx.obj /LIBPATH:"lib" "kernel32.lib" "user32.lib" "gdi32.lib" "shell32.lib" /MACHINE:X64 /nologo

我不太明白它是如何工作的,但它解决了问题。

【讨论】:

    【解决方案2】:

    -> 要链接目标文件,您需要使用链接 /out objectfile.obj。它是 Microsoft Docs 中引用的正确方法。 -> 甚至想如果你遇到那个恼人的错误试试这个链接 https://docs.microsoft.com/en-us/cpp/build/reference/linking?view=vs-2019

    ->此页面包含所有 CMD 链接内容 https://docs.microsoft.com/en-us/cpp/build/reference/linker-options?view=vs-2019

    您也可以使用 /WHOLEARCHIVE,此命令获取目标文件库的路径。

    ->此页面包含 /WHOLEARCHIVE 内容 https://docs.microsoft.com/en-us/cpp/build/reference/wholearchive-include-all-library-object-files?view=vs-2019

    还有另一种链接对象文件的方法 /Fo 命令。此命令再次获取目标文件的路径值

    -> /Fo 东西 https://docs.microsoft.com/en-us/cpp/build/reference/fo-object-file-name?view=vs-2019

    -> 我正在添加此链接,因为我认为该行命令中可能隐藏了某种错误的命令。 https://docs.microsoft.com/en-us/cpp/build/creating-precompiled-header-files?view=vs-2019 以上包含Visual Studio和MSVC++编译器中的预编译文件

    【讨论】:

    • 您的回答使我朝着正确的方向前进,最终我设法实现了预编译头文件,但我认为这有点误导 - 选项 /out 用于命名可执行文件, /WHOLEARCHIVE 用于 .lib 文件和不相关
    猜你喜欢
    • 2016-05-26
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多