2011-01-10 1418 views
15

我试图建立在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

请查看:[如何修复MSB8012(Lib.OutputFile)?](http://connect.microsoft.com/VisualStudio/feedback/details/523864/how-to-fix-msb8012-lib-outputfile) [Visual Studio 2010中 - $(的TargetName)宏(http://social.msdn.microsoft.com/Forums/en/vcprerelease/thread/3c03e730-6a0e-4ee4-a0d6-6a5c3ce4343c) – 2011-01-10 20:11:43

回答

3

警告是虚假的 - 假设你使用谷歌测试,它工作得很好

你可以但它消失。右键单击有问题的项目并选择属性。在左侧的树视图中选择“Librarian”,并通过单击输出文件旁边的框并选择“从父​​项或项目默认继承”来更改右侧的“输出文件”项。

+4

这是不正确的答案。这*改变了输出文件的名称,.lib的调试和发布版本现在都被命名为gtest。无论上次构建什么,都会覆盖该文件。当他最终将.lib的发布版本链接到他想测试的代码的调试版本时,这让OP很麻烦。他后来删除了这个问题,我猜他有点想清楚了。 – 2011-01-11 10:09:16

+1

@Hans:不正确。 Visual Studio已经将这些文件放在单独的文件夹中。如果您决定将库复制到单个目录中,则只需要额外的“d”。 – 2011-01-11 14:22:07

23

我看到它。右键单击gtest项目,属性,配置属性,常规。确保选择了调试配置(左上角的组合)。目标名称属性更改为

$(ProjectName)d 

注意添加“d”的名字从GTEST改为gtestd。警告是否是良性的。

2

将旧项目升级到Visual Studio的新版本时(例如在VS2010中)以及项目设置可能已被手动更改(例如更改可执行文件名称)时,通常会出现此类错误。我们知道VS2010使用这些宏$(ProjectName)$(TargetName)$(OutDir)$(TargetExt)控制释放/调试输出,但它往往是神秘的地方进行更改。我们通常通过Project >> Properties直接更改输出文件的名称。这意味着我们现在必须单独更改输出文件以进行调试和发布构建,并且如果存在任何依赖关系,我们将得到像This may cause your project to build incorrectly.这样的错误。

这些宏/属性是VS2010默认,但你可以通过在记事本编辑它自己设定他们的.vcproj文件。首先请注意首先搜索.vcproj文件中的属性,如果它的值不改变它的值,如果没有定义它,如下所示。

<PropertyGroup Label="My Values"> 
    <ProjectName>New_Project_Name</ProjectName> 
    </PropertyGroup> 

上面我已经定义了一个新的<property group>保存这些值,但你可以在任何地方进行定义。我在调试/发布配置组之后立即在文件的顶部定义它,以便它在任何地方都可见。确保您的项目属性设置正确,以正确使用它们(它们应该是什么VS2010默认设置)。如果你改变了它们,你应该从新的测试项目中复制它。您当然也可以在上面的组中添加您想为其设置值的其他宏。

您也可以通过项目属性验证这个宏的新值。例如,单击配置属性>>常规,然后在“目标名称”框中单击。选择编辑。它会弹出一个对话框,其中包含按钮'MACROS >>'。点击它,它会告诉你每个宏的价值。它应该正确地反映您在.vcproj文件中设置的新值。

8

我觉得没有人有正确答案,我这样解决:在项目属性页面中,检查linker->General->Output file是否匹配configuration properties->General->target name & configuration properties->General->target extension

你不需要添加任何“d”,当然,更简单的设置为Inherit from parent or project defaults,所有3个变量。

例子:

Linker → General → Output File = "myproject.exe" 

则:

Configuration Properties → General → Target Name = "myproject" 

configuration properties → General → Target Extension = ".exe" 
0

的背景是,微软改变了$(的TargetName)宏的含义。它用来表示“你输入链接器|输出文件的任何文件名,减去扩展名”。他们将其更改为“默认情况下,您的项目的名称”。 (在我看来,这是你永远不应该做的事情;他们应该添加一个新的宏)。

尽管VS2008和更早版本能够将文件名解析为Linker设置,但显然在迁移到较新版本时无法解析它,导致配置中断。

警告本身可能并不重要,但如果你使用$(的TargetName),将它传递给一个批处理文件说,这种变化会破坏你的批处理过程。

对于我们来说,解决方案是从链接器复制文件名(减去扩展名)输出文件到常规|目标名称,然后设置链接器|输出文件“从父母/默认继承”。这是因为我们使用了诸如“d”(用于调试),“u”用于Unicode的后缀,用于64位的_64等等。

在另一方面,如果你的输出文件总是相匹配的项目的名称,那么所有你需要做的就是设置链接|输出文件“继承默认值”,原则上你已经完成了,只要你的编译文件的输出目录与General |输出目录。

这种变化是绝对令人气愤,因为它涉及到从字面上走动数以百计的设置,都由于对微软的一部分纯粹的懒惰,据我所看到的。

相关问题