CMake编译VS项目出现error MSB3073: 命令“setlocal.... “

有以下三种原因,均会导致这个问题的出现,需要同时避免:


原因1:

install文件需要管理员权限,打开VS时不是使用管理员权限打开。

解决方法:

        方式1)退出VS,再用管理员权限打开VS,然后就好了。

        方式2)把install位置放在C盘之外。我采纳的这种方式。

                我选择方式2的原因是:1)节省C盘空间;2)便于规范化管理,源代码和install的位置在一起,便于寻找该源文件产生的静态库,从而便于给别的依赖库提供支撑;3)操作简单,configure和generate之后,直接点击open project即可,比较方便。

CMake编译VS项目出现error MSB3073: 命令“setlocal.... “_第1张图片

展开cmake组, 修改里面的CMAKE_INSTALL_PREFIX选项。

(备注,在上图中我标注出了Grouped和Advanced两个选项,其中Grouped用于把CMakeLists.txt内容条目化并分组;Advances选项,用于显示依赖库,并配置依赖库的寻找路径,比如,我这里要编译的libpng依赖于zlib)

CMake编译VS项目出现error MSB3073: 命令“setlocal.... “_第2张图片


原因2:

设置的build的目录不对。

解决方法:build目录应该放在文件根目录下,而不是根目录外面。


原因3:

下载的编译库的版本不对,一般.zip压缩格式的版本是针对windows系统的;.tar.gz压缩格式的版本是针对linux系统的。不同版本的CMakeLists.txt上有细微差异。重新下载依赖库的版本即可。

比如我一开始编译的是libpng-1.6.34.tar.gz版本,一直出现setlocal的问题。通过以上两种方法都没有解决。直到意识到这个问题,重新下载.zip版本之后,一切都顺理成章,很顺利。

解决方法:

方式1)重新下载对应的.zip版本的依赖库。

方式2)其实在windows下也能编译linux版本的依赖库,因为底层都是C/C++,而CMAKE也是跨平台的工具。只需要简单修改CMakeLists.txt即可。

        (1)打开CMakeLists.txt,找到project()指令,我的如下

cmake_minimum_required(VERSION 3.0.2)
cmake_policy(VERSION 3.0.2)

# Set MacOSX @rpath usage globally.
if (POLICY CMP0020)
  cmake_policy(SET CMP0020 NEW)
endif(POLICY CMP0020)
if (POLICY CMP0042)
  cmake_policy(SET CMP0042 NEW)
endif(POLICY CMP0042)
# Use new variable expansion policy.
if (POLICY CMP0053)
  cmake_policy(SET CMP0053 NEW)
endif(POLICY CMP0053)
if (POLICY CMP0054)
  cmake_policy(SET CMP0054 NEW)
endif(POLICY CMP0054)

set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")

project(libpng ASM C)# 我的在这里-----------------------------
enable_testing()

        (2)把project()命令中的ASM删除,如下

cmake_minimum_required(VERSION 3.0.2)
cmake_policy(VERSION 3.0.2)

# Set MacOSX @rpath usage globally.
if (POLICY CMP0020)
  cmake_policy(SET CMP0020 NEW)
endif(POLICY CMP0020)
if (POLICY CMP0042)
  cmake_policy(SET CMP0042 NEW)
endif(POLICY CMP0042)
# Use new variable expansion policy.
if (POLICY CMP0053)
  cmake_policy(SET CMP0053 NEW)
endif(POLICY CMP0053)
if (POLICY CMP0054)
  cmake_policy(SET CMP0054 NEW)
endif(POLICY CMP0054)

set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")

project(libpng C) # 我的修改在这里-----------------------
enable_testing()

        (3)问题解决,很顺畅。 

原因4(可能):

        cmake版本过于新,与第三方依赖库的版本不兼容。无论是cmake还是第三方依赖库,都是在不断迭代更新的。某个时间段的第三方依赖库是用当时的cmake编译的。随着cmake的迭代更新,可能在一些小特性上发生了一些小的变化,导致新版本的cmake不再适配老版本的第三方依赖库。此时,如果一定要使用一个老版本的第三方依赖库,建议使用对应时间段的cmake去编译,应该会好一些。

解决方法:

        查看第三方依赖库的发布时间,找到对应时间段的cmake,下载并安装。然后用对应版本的cmake编译第三方依赖库。


参考:CMake编译VS项目出现error MSB3073: 命令“setlocal.... “_严重性代码说明项目文件行禁止显示状态 错误msb3073命令“setlocal "c:\p-CSDN博客

你可能感兴趣的:(windows)