【问题标题】:How to set $(OutDir), $(TargetName), $(TargetExt), and %(Lib.OutputFile) with Visual Studio?如何使用 Visual Studio 设置 $(OutDir)、$(TargetName)、$(TargetExt) 和 %(Lib.OutputFile)?
【发布时间】:2011-06-06 18:21:12
【问题描述】:

我正在尝试在 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)做到这一点?

【问题讨论】:

标签: visual-studio unit-testing googletest


【解决方案1】:

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

 $(ProjectName)d

注意添加的“d”以将名称从 gtest 更改为 gtestd。该警告是良性的。

【讨论】:

    【解决方案2】:

    我认为没有人有正确的答案,我是这样解决的:在项目属性页面中,检查 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"
    

    【讨论】:

      【解决方案3】:

      警告是虚假的——假设您使用的是 Google Test,它可以正常工作

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

      【讨论】:

      • 这不是正确的答案。这更改输出文件的名称,.lib 的调试和发布版本现在都命名为 gtest。最后构建的任何内容都将覆盖该文件。当他最终将 .lib 的发布版本链接到他想要测试的代码的调试版本时,这让 OP 陷入了麻烦。他后来删除了这个问题,我想他有点想通了。
      • @Hans:不正确。 Visual Studio 已经将这些文件放在单独的文件夹中。仅当您决定将库复制到单个目录时才需要额外的“d”。
      • 如果我希望名称保持不变怎么办?我认为@HansPassant 提供的答案更正确。
      • @alariq: 1. 我不知道你为什么要这么做。 2. 即使你这样做了,汉斯的回答和我的回答基本上是一样的。
      • @BillyONeal:这是从一个解决方案版本转换到另一个解决方案版本时的常见问题。另一个原因是如果是这种情况那么您还必须手动更改 Debugging->Command。因为它默认设置为 $(TargetPath)。问题是 $(TargetName) (这是 $(TargetPath) 的一部分)与输出文件不同。
      【解决方案4】:

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

      虽然 VS2008 及更早版本能够从链接器设置中解析文件名,但显然他们无法在迁移到新版本时将其解析出来,从而导致我们的配置被破坏。

      警告本身可能并不重要,但如果您使用 $(TargetName),例如将其传递给批处理文件,此更改将中断您的批处理过程。

      对我们来说,解决方案是从 Linker | 复制文件名(减去扩展名)。输出文件到一般 | Target Name,然后设置 Linker |输出文件“从父/默认继承”。这是因为我们使用诸如“d”(用于调试)、“u”用于 Unicode、_64 用于 64 位等后缀。

      另一方面,如果您的输出文件始终与项目名称匹配,那么您需要做的就是设置 Linker |输出文件到“继承默认值”,原则上你就完成了——只要你想要的编译文件的输出目录与 General |输出目录。

      这种变化绝对令人恼火,因为它涉及移动数百个设置,据我所知,这完全是由于微软的懒惰。

      【讨论】:

        【解决方案5】:

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

        我想我会用屏幕截图直观地展示我的所作所为。

        解决方案名称 v 目标名称

        如您所见,我的变量都设置为 Import Text

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

        链接器/通用输出文件

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

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

        常规/目标名称

        所以我所要做的就是在这里做同样的调整:

        现在它编译文件。

        【讨论】:

        • TargetName 现在位于 VS2019 的“高级”选项卡中。更改后仍会更改 $TargetExt 变量。
        【解决方案6】:

        在将旧项目升级到新版本的 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>
        

        上面我定义了一个新的&lt;property group&gt; 来保留这些值,但您可以在任何地方定义它们。我在调试/发布配置组之后在文件顶部定义了它,因此它随处可见。确保您的项目属性设置正确以正确使用它们(它们应该是 VS2010 默认设置)。如果你改变了它们,你应该从新的测试项目中复制它。当然,您也可以在上述组中添加要为其设置值的其他宏。

        您还可以通过项目属性验证此宏的新值。例如,单击配置属性>>常规,然后单击“目标名称”框。选择编辑。它将弹出一个带有按钮'MACROS &gt;&gt;' 的对话框。单击它,它将显示每个宏的值是什么。它应该正确反映您在 .vcproj 文件中设置的新值。

        【讨论】:

        • 谢谢。我一直在寻找如何设置那些构建时间符号。
        • @zadane - 原谅我的无知... 对于 VS2010,OutputDirectoryOutputFile 在 VCUpgrade 之后设置正确。但是,TargetNameTargetExt 不见了。我们如何使用您的技巧将 TargetNameTargetExt 添加到 VS2005 中,这样它才能在 VS2010 升级后幸存下来(对于 VS2010 用户来说,事情“正常工作”)?另见How to modify TargetName and TargetExt by changing the project file's XML?
        • @zar - 看起来系统因为浏览量太少而删除了它;也没有答案或 cmets。
        【解决方案7】:

        正如 Hans Passant 所发布的,您需要手动修改 TargetName 属性。这在 VS2005/2008 和 VS2010 之间是不同的。请参考http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/3c03e730-6a0e-4ee4-a0d6-6a5c3ce4343c

        【讨论】:

          猜你喜欢
          • 2011-05-28
          • 2015-11-16
          • 1970-01-01
          • 1970-01-01
          • 2013-04-07
          • 2017-05-25
          • 1970-01-01
          • 1970-01-01
          • 2016-10-25
          相关资源
          最近更新 更多