我正在尝试在Visual Studio 2010上构建gtest。转换解决方案文件后,我尝试构建,并收到以下警告消息。
Warning 1 warning MSB8012:
TargetPath(C:\Users\sucho\Desktop\gtest-1.5.0\msvc\gtest/Debug\gtest.lib) does not match
the Library's OutputFile property value (C:\Users\sucho\Desktop\gtest-1.5.0\msvc\gtest\
Debug\gtestd.lib).
This may cause your project to build incorrectly.
To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property
values match the value specified in %(Lib.OutputFile).
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets
消息说我需要设置变量$(OutDir)
,$(TargetName)
和$(TargetExt)
,以及%(Lib.OutputFile)
中指定的属性值。
我如何使用Visual Studio(尤其是VS 2010)?
答案 0 :(得分:24)
我明白了。右键单击gtest项目,Properties,Configuration properties,General。确保选择了Debug配置(左上角组合)。将目标名称属性更改为
$(ProjectName)d
注意添加“d”将名称从gtest更改为gtestd。否则警告是良性的。
答案 1 :(得分:8)
我认为没有人有正确的答案,我这样解决了:在项目属性页面中,检查linker->General->Output file
是否匹配configuration properties->General->target name
& configuration properties->General->target extension
。
对于所有3个变量,您不需要添加任何“d”,当然,更简单的设置为Inherit from parent or project defaults
。
示例:
Linker → General → Output File = "myproject.exe"
然后:
Configuration Properties → General → Target Name = "myproject"
configuration properties → General → Target Extension = ".exe"
答案 2 :(得分:3)
警告是虚假的 - 假设您正在使用Google测试,它可以正常使用
然而,你可以让它消失。右键单击违规项目并选择属性。在左侧的树视图中选择“Librarian”,然后通过单击输出文件旁边的框并选择“从父项或项目默认值继承”来更改右侧的“输出文件”项。
答案 3 :(得分:2)
这种错误通常在将旧项目升级到Visual Studio的新版本时(例如在VS2010中)以及项目设置可能已手动更改(例如更改可执行文件名称)时出现。我们知道VS2010使用这些宏$(ProjectName)
$(TargetName)
$(OutDir)
$(TargetExt)
来控制释放/调试输出,但更改它们通常很神秘。我们通常直接通过Project>>来改变输出文件的名称。属性。这意味着我们现在必须单独更改输出文件以进行调试和发布构建,如果存在任何依赖关系,我们将收到类似This may cause your project to build incorrectly.
的错误。
这些宏/属性是VS2010默认值,但您可以在.vcproj文件中通过在记事本中进行编辑来自行设置它们。注意首先搜索.vcproj文件中的属性,如果它在那里而不是更改它的值,如果没有像下面那样定义它。
<PropertyGroup Label="My Values">
<ProjectName>New_Project_Name</ProjectName>
</PropertyGroup>
上面我定义了一个新的<property group>
来保存这些值,但您可以在任何地方定义它们。我在调试/发布配置组之后立即在文件的顶部定义它,因此它在任何地方都可见。确保正确设置项目属性以正确使用它们(它们应该是VS2010的默认设置)。如果您更改了它们,则应从新测试项目中复制它。您当然可以在上面的组中添加您想要设置值的其他宏。
您还可以通过项目属性验证此宏的新值。例如,单击配置属性&gt;&gt;常规,而不是“目标名称”框。选择编辑。它将弹出一个带有按钮'MACROS >>'
的对话框。单击它,它将显示每个宏的值是什么。它应该正确反映您在.vcproj文件中设置的新值。
答案 4 :(得分:1)
正如Hans Passant发布的那样,您需要手动修改TargetName属性。这与VS2005 / 2008和VS2010不同。请参阅http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/3c03e730-6a0e-4ee4-a0d6-6a5c3ce4343c
答案 5 :(得分:1)
这背景是微软改变了$(TargetName)宏的含义。它曾经意味着&#34;你在Linker中放置的任何文件名输出文件,减去扩展名&#34;。他们将其更改为&#34;默认情况下,项目名称为#34;。 (在我看来,这是你不应该做的事情;他们应该添加一个新的宏)。
VS2008及更早版本能够从链接器设置中解析文件名,显然他们无法在迁移到更新版本时解析它,导致我们的配置中断。
警告本身可能并不重要,但如果您使用$(TargetName),例如将其传递给批处理文件,则此更改将破坏您的批处理过程。
对我们来说,解决方案是从Linker |复制文件名(减去扩展名)输出文件到常规|目标名称,然后设置链接器|输出文件到&#34;从父/默认&#34;继承。这是因为我们使用&#34; d&#34;等后缀。 (用于调试),&#34; u&#34;用于Unicode,_64用于64位等等。
另一方面,如果您的输出文件始终与项目名称匹配,那么您需要做的就是设置Linker |输出文件到&#34;继承默认&#34;原则上你已经完成了 - 提供你想要的编译文件的输出目录与General |相匹配输出目录。
这种变化绝对令人愤怒,因为它涉及到数百个设置,这完全归功于微软部分的纯粹懒惰,据我所见。
答案 6 :(得分:1)