警告MSB8012:确保$(OutDir),$(TargetName)和$(TargetExt)属性值与%(Link.OutputFile)中指定的值匹配

时间:2010-12-20 21:16:10

标签: visual-studio-2010 visual-c++ warnings

构建代码时出现以下错误。

  

C:\ Program Files   (86)\的MSBuild \ Microsoft.Cpp \ V4.0 \ Microsoft.CppBuild.targets(990,5):   警告MSB8012:   TARGETPATH(E:\学习\ FWIF \ demola \ EXT-库\ libcommoncpp2-1.6.0 \ W32 \调试\ ccgnu2.dll)   与Linker的OutputFile属性值不匹配   克\ CapeCommon14.dll)。这可能会导致您的项目构建不正确。   要更正此问题,请确保$(OutDir),$(TargetName)和   $(TargetExt)属性值与中指定的值匹配   %(Link.OutputFile)。

我希望有人知道该怎么做。

8 个答案:

答案 0 :(得分:26)

您是否从以前的版本将项目升级到Visual Studio 2010?如果是这样,这是一个众所周知的问题。

Visual Studio 2010 C ++项目升级指南 http://blogs.msdn.com/b/vcblog/archive/2010/03/02/visual-studio-2010-c-project-upgrade-guide.aspx

  

升级期间的警告

     

以下是转换过程中可能遇到的一些常见警告:

     

1)链接器输出目录

     

升级应用程序时可能会看到的警告之一是MSB8012:$(TargetPath)和Linker的OutputFile属性值不匹配:

     
      
  • MSB8012:$(TargetExt)('。dll')与项目配置'Debug |中的链接器的OutputFile属性值'C:\ foo \ Debug \ MFCActiveX.ocx'('。ox')不匹配。 Win32' 的。这可能会导致您的项目构建不正确。要更正此问题,请确保$(TargetExt)属性值与%(Link.OutputFile)中指定的值匹配。

  •   
  • MSB8012:$(TargetPath)('C:\ foo \ Debug \ MFCActiveX.dll')与链接器的OutputFile属性值'C:\ foo \ Debug \ MFCActiveX.ocx'不匹配('C:项目配置'Debug | Win32'中的\ foo \ Debug \ MFCActiveX.ocx')。这可能会导致您的项目构建不正确。要更正此问题,请确保$(TargetPath)属性值与%(Link.OutputFile)中指定的值匹配。

      Link.OutputFile是Linker定义的值 - >一般 - >属性页面上的输出文件。默认情况下,其值为$(OutDir)$(TargetName)$(TargetExt),它与$(TargetPath)的值相同。但是,当我们从先前版本转换应用程序时,没有一种简单的方法可以转换为解析Link.OutputFile来确定$(TargetName)和$(TargetExt)的确切值,因为不同的客户可能已经格式化了他们以不同的方式。为了解决这个问题,我们决定在转换期间保留Linker.OutputFile的值。转换后,$(TargetName)将默认为$(ProjectName)。 $(TargetExt)将默认为应用程序类型的默认扩展名:动态库的.dll,静态库的.lib和应用程序的.exe。 Link.OutputFile值将被保留。警告如果Link.OutputFile和$(TargetPath)不相同,将在转换日志中发出MSB8012。构建应用程序时,您将收到相同的警告。

      $(OutDir),$(TargetName)和$(TargetExt)分别在“常规”属性页面上显示为“输出目录”,“目标名称”,“目标扩展名”。您可以手动更改这些属性的值,以便不再收到警告。

  •   
  • 如果您的项目生成导入库(链接器 - >高级 - >导入库),如果链接器输出目录不是默认值,您可能需要在转换后更改导入库的输出文件夹输出目录。否则,生成的导入lib可能位于与链接器输出不同的目录中。

  •   
  • 转换后,Debugging.Command设置为默认值$(TargetPath)。您可能需要进行更改,以便在F5(调试)或Ctrl + F5(无需调试时启动)时启动正确的可执行文件。

  •   

答案 1 :(得分:6)

另见Stackoverflow MSB8012。 将VS2008 C ++项目转换为VS2012时,对我有用:右键单击解决方案资源管理器中的项目,在弹出窗口中选择属性:配置属性,链接器,常规。选择右侧的输出文件,这会给出一个下拉列表,从父项或项目默认值中选择固有。单击“应用”这给出了默认的链接器设置:$(OutDir)$(TargetName)$(TargetExt)。重新构建项目,不再出现警告。

答案 2 :(得分:4)

调试DLL出现了同样的问题,我希望在basename中有一个尾随的“D”。例如, foo.dll (发布),但 fooD.dll (调试)。在调试配置的链接器设置中优化输出名称时,会出现丑陋的MSB8012警告。

唯一适用于Visual-Studio 2010的解决方案似乎是Debug-Configuration的Postbuild-Event:

@echo off
echo Copying $(OutDir)$(TargetName)$(TargetExt) as $(TargetName)D$(TargetExt)
copy /Y $(OutDir)$(TargetName)$(TargetExt) $(OutDir)$(TargetName)D$(TargetExt)

答案 3 :(得分:3)

我的情况是我的可执行文件名与项目名称不同而且我希望它将可执行文件/ dll构建到与项目所在位置不同的位置。

1)将默认项目名称更改为不同。   常规 - >的TargetName
 <我的可执行文件名称>

2)输出到我想要构建可执行文件的其他位置。    常规 - >输出目录   <我的新位置在这里>

3)更新链接器设置。    连接体 - >常规    新值:$(OutDir)$(TargetName)$(TargetExt)
这将采用1和2的新设置。

答案 4 :(得分:1)

从旧项目转换到VS 2010后,我得到了同样的错误。

为了解决这个问题,我创建了相同类型的空项目(例如.dll,.lib,.exe) 然后我将Project Propeties中的默认值复制到我的输出目录项目,中间目录和输出文件

答案 5 :(得分:1)

转到项目->属性->配置属性->链接器->常规部分

将“输出文件”指定为$(OutDir)$(TargetName)$(TargetExt)

答案 6 :(得分:0)

我设法通过手动编辑vcxproj文件来解决类似的问题。

OutDirTargetName设置位于项目文件的底部。

   ...
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
        <OutDir>$(OUTPUT_DIRECTORY)\</OutDir>
        <IntDir>$(ProjectDir)\$(Configuration)\$(ProjectName)\</IntDir>
        <TargetName>$(ProjectName)</TargetName>
      </PropertyGroup>
   </Project>

将块移动到ClCompile块上方可以解决此问题。

答案 7 :(得分:0)

我通过将项目与工作正常的非常相似的项目进行比较来解决此问题。项目属性中的所有设置都匹配,但是我在发生故障的项目的vcxproj文件中找到了以下额外的行:

<Lib>
   <OutputFile>.\MCtlDrvX.lib</OutputFile>
</Lib>

我删除了它们,消息消失了,输出进入了项目设置中指定的目录。