对于单个 cpp 文件,Visual Studio 编译选项是灰色的

问题描述 投票:0回答:3

我被要求帮助一位同事解决通用解决方案中一个项目中的神秘构建错误。构建错误发生在链接阶段,在静态库(a.lib)中定义的类构造函数在包含该a.lib的库(b.lib)中使用时找不到该类构造函数。经过仔细研究,我发现:

  1. 类中正确定义了构造函数。
  2. 该类在属于该项目的 cpp 文件中定义。
  3. 如果尝试使用智能感知导航到 cpp 文件或类构造函数,一切都会按预期进行。

vcxproj 文件 ClCompile ItemGroup:

...
<ClCompile Include="Source\CMYKOVBLab.cpp" />
<ClInclude Include="Source\CMYKOBGLab.cpp" />  <--- The file is here.
<ClCompile Include="Source\CMYKOVBRGB.cpp" />
...

综上所述,链接库所需的内容已经有了,但链接错误仍然存在。

我注意到的一个奇怪的事情是,通过按 Ctrl-F7 或 a.lib 中的右键无法编译未找到类构造函数的 cpp。该选项呈灰色,但仅适用于该特定文件。此外,当我构建应该编译该文件的 a.lib 库时,它没有编译,因此没有创建目标文件。

可能是什么原因?我该如何修复它?

我正在使用 Visual Studio Professional 2015 Update 3。

c++ visual-studio visual-studio-2015 linkage vcxproj
3个回答
2
投票

在 VS 2015 中,.vcxproj 项目文件中定义的编译包含文件预计按字典顺序排列。

这在 VS 2017 中不再需要,但当它不受尊重时,VS 2015 可能会造成这种混乱。

您的同事已手动修改.vcxproj项目文件以包含该文件,但他没有遵守字典顺序。您只需从项目中删除文件然后再次将其添加回来。 Visual Studio 会将其包含在正确的位置,并且您的构建将会成功。

希望这也能帮助其他人。


1
投票

您的源文件无法编译,因为它已添加到 .vcxproj 文件中的“ClInclude”元素(用于标头)中。手动或通过在 Visual Studio 中删除并读取它来将其修复为 ClCompile,然后它将编译。


0
投票

如果你使用qt+Visual Studio,我发现vs qt插件在手动拖入文件时有一个bug。真正的原因是,如果qt插件在添加头文件时检测到

Q_OBJRCT
宏,就会使用
QtMoc 
包含头文件而不是
Cllnclude
,但可能会失败。但是右键添加不会出现此问题 如果你使用qt+visual studio,我在vs qt插件手动拖动文件时发现一个bug。真正的原因是,如果qt插件在添加头文件时检测到'Q_OBJRCT'宏,将会使用'QtMoc'来包含头文件不是'cllninclude',但可能会失败。但是右键添加不会出现这个问题

© www.soinside.com 2019 - 2024. All rights reserved.