xxx\Microsoft.Common.targets: error MSB3073: The command xxx exited with code 4

本文介绍了一个VS2010中C#项目的编译错误MSB3073,错误代码为4,通过分析发现是由于XCOPY命令尝试复制的文件正在被使用导致。文章详细解释了错误原因及解决办法。

http://www.crifan.com/microsoft_common_targets_error_msb3073_command_exited_with_code_4/

在VS2010中编译一个C#项目,结果出错:

?
1
2
3
4
5
6
7
8
9
10
PostBuildEvent:
  XCOPY /D /Y /R "D:\tmp\xxx\InsertSkydriveFiles\bin\Debug\crifan.InsertSkydriveFiles.dll" "C:\Program Files (x86)\Windows Live\Writer\Plugins"
  D:\tmp\xxx\InsertSkydriveFiles\bin\Debug\crifan.InsertSkydriveFiles.dll
  Sharing violation
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(3717,9): error MSB3073: The command "XCOPY /D /Y /R " D:\tmp\tmp_dev_root\wlw\InsertSkydriveFiles_v4.0_2012-04-02-office\InsertSkydriveFiles\bin\Debug\crifan.InsertSkydriveFiles.dll " " C:\Program Files (x86)\Windows Live\Writer\Plugins "" exited with code 4.
Build FAILED.
Time Elapsed 00:00:01.00
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

【解决过程】

1. 看到上面的错误提示中,有对应的PostBuildEvent和XCOPY,然后知道了是上述的XCOPY命令出错了。

2.网上从  MSB3073: exited with code 4 得知“MSB3073 is just a generic error that means an Exec task returned a non-zero error code. ”。且在这里 Xcopy,中找到exit code 的含义:

 

Exit code

Description

0

Files were copied without error.

1

No files were found to copy.

2

The user pressed CTRL+C to terminate xcopy.

4

Initialization error occurred. There is not enough memory or disk space, or you entered an invalid drive name or invalid syntax on the command line.

5

Disk write error occurred.

对照解释来分析此处的错误原因:

(1)no enough memory or disk space:此处硬盘空间足够大,故不是此原因

(2) entered an invalid drive name:之前此命令可以正常执行的,所以也不是此原因。

(3)invalid syntax on command line:同上,故也不是此原因。

官方文档描述的原因,都不匹配。

3. 后来还是自己找到了原因:XCOPY所拷贝的目标文件“"C:\Program Files (x86)\Windows Live\Writer\Plugins”中的“crifan.InsertSkydriveFiles.dll”正在被使用,导致XCOPY无法覆盖式的将crifan.InsertSkydriveFiles.dll拷贝过去,才导致上述错误的。

而“crifan.InsertSkydriveFiles.dll”正在被使用,是因为其是WLW(Windows Live Writer)的一个插件,而当前打开了WLW,插件也被加载了,所以是“正在使用”,导致XCOPY无法将原先的crifan.InsertSkydriveFiles.dl拷贝到C:\Program Files (x86)\Windows Live\Writer\Plugins,无法将其覆盖。

【总结】

如果出现MSB3073类错误,那么说明是程序运行出错(返回值非0)。

具体的错误原因,需要根据当前程序以及返回值来确定。

就像此处的,当前运行程序是XCOPY,返回错误代码是4,对应的根本原因找到了是无法把源文件拷贝到目标文件夹去,因为目标文件夹下的同名源文件正在被使用,而导致XCOPY出错,返回值为4的。

 

### 三级标题:MSB3073 错误的原因分析 MSB3073 错误通常发生在使用 CMake 构建项目时,执行 `INSTALL` 阶段的过程中。错误信息中的关键部分是: ``` 命令“setlocal ...”已退出,代码为 1 ``` 这表明执行的命令脚本在某个环节失败,返回了非零退出码。这类错误通常与以下原因有关: 1. **权限不足**:在执行 `cmake_install.cmake` 脚本时,可能需要管理员权限来创建目录或写入文件,尤其是在目标路径为受保护目录(如 `C:\Program Files` 或 `C:\Program Files (x86)`)时[^3]。 2. **路径问题**:路径中包含空格或特殊字符可能导致命令行解析失败。例如,`"D:\Program Files"` 中的空格如果没有被正确转义,可能会导致问题。 3. **CMake 安装阶段配置错误**:如果 `CMakeLists.txt` 中配置了 `install()` 指令,但未正确指定目标路径或文件结构,可能导致 `cmake_install.cmake` 文件执行失败。 4. **构建工具(如 MSBuild)问题**:Visual Studio 或 MSBuild 的某些配置或版本问题也可能导致此错误。 --- ### 三级标题:解决方案 #### 1. 使用管理员权限运行构建工具 如果目标路径需要管理员权限(如 `C:\Program Files` 或 `C:\Program Files (x86)`),请尝试以管理员身份运行 Visual Studio 或命令行工具。这样可以确保 `cmake_install.cmake` 脚本能够成功创建目录和写入文件[^3]。 #### 2. 检查路径中的空格并转义 确保路径中包含空格时,路径应使用双引号包裹。例如,将: ```bat "D:\Program Files\CMake\bin\cmake.exe" -DBUILD_TYPE=Debug -P cmake_install.cmake ``` 改为: ```bat ""D:\Program Files\CMake\bin\cmake.exe" -DBUILD_TYPE=Debug -P cmake_install.cmake" ``` 这样可以避免命令行解析失败。 #### 3. 禁用安装阶段(INSTALL_COMMAND) 如果项目中使用了 `ExternalProject_Add`,可以通过设置 `INSTALL_COMMAND ""` 来禁用安装阶段,避免 `cmake_install.cmake` 执行失败的问题。例如: ```cmake ExternalProject_Add(External_B_name_I_set SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/external/B CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/external/B INSTALL_COMMAND "" ) ``` 这可以有效避免默认安装阶段导致的错误[^2]。 #### 4. 检查 CMakeLists.txt 中的 install() 配置 如果项目中使用了 `install()` 命令,确保其配置正确。例如: ```cmake install(TARGETS my_target DESTINATION bin) install(DIRECTORY include/ DESTINATION include) ``` 确保目标路径存在且可写,避免因路径不存在或权限不足导致安装失败。 #### 5. 清理缓存并重新生成构建文件 有时旧的缓存可能导致问题。可以尝试删除 `CMakeCache.txt` 和 `CMakeFiles` 目录,然后重新运行 CMake 生成构建文件: ```bash rm -rf CMakeCache.txt CMakeFiles cmake . ``` 或者在 Windows 上使用: ```cmd del CMakeCache.txt rmdir /s /q CMakeFiles cmake . ``` #### 6. 更新 Visual Studio 和 MSBuild 确保使用的 Visual Studio 和 MSBuild 是最新版本。有时旧版本的构建工具可能存在兼容性问题,更新到最新版本可以解决此类问题。 --- ### 三级标题:代码示例 以下是一个典型的 `CMakeLists.txt` 文件示例,展示了如何正确配置 `install()` 命令: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject) add_executable(my_target main.cpp) # 安装可执行文件到 bin 目录 install(TARGETS my_target DESTINATION bin) # 安装头文件到 include 目录 install(DIRECTORY include/ DESTINATION include) ``` 在构建时,确保目标路径存在且可写,避免因权限问题导致安装失败。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值