如何使用Visual Studio设置$(OutDir),$(TargetName),$(TargetExt)和%(Lib.OutputFile)?

时间:2011-01-10 20:08:09

标签: visual-studio unit-testing googletest

我正在尝试在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)?

7 个答案:

答案 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)

我只是想在 Visual Studio 2019 中编译我上次在 Visual Studio 2005 中编译的应用程序。我遇到了同样的警告。

我以为我会通过屏幕快照视觉上来展示我所做的事情。

解决方案名称v目标名称

如您所见,我的变量都设置为导入文本

Image 1

我可以将$(TargetName)设置为 ImportText 来解决我的问题。但是,我们将这些值保持不变。

链接器/常规输出文件

这是我设置输出文件的方式:

Image 2

请注意,我已覆盖输出目标名称为 ImportText 。这是10多年前的事,我没有那么多经验。

常规/目标名称

所以我要做的就是在此处进行相同的调整:

Image 3

现在可以编译文件了。