使用 MSBuild 构建 VS2012/VS2013 项目时出现问题

Issue with using MSBuild to build a VS2012/VS2013 Project

我正在尝试在 cygwin 中自动构建(当前工作)Visual Studio 2013,以便我可以自动构建我的项目并 运行 它。我的项目是使用VS2012工具集编译的。

我目前在 cygwin 中有此 bash 脚本 运行ning(基于此博客 post:http://anthonykosky.blogspot.com/2013/10/making-visual-studio-solutions-cmake.html):

###### FIRST -- import the Visual Studio settings
export PATH=$PATH:"/cygdrive/C/Windows/system32"

CMD=/cygdrive/c/Windows/system32/cmd
${CMD} /c "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat"

# alias for MSBUILD
MSBUILD="/cygdrive/c/Program Files (x86)/MSBuild/12.0/Bin/MSBuild.exe"

# We're going to do a 64 bit release build
BUILD_CONFIG=Release
PLATFORM=x64

MSBUILD_LOG=msbuild.log

SLN_FILE=

"${MSBUILD}" ${SLN_FILE} /fl /property:Configuration=${BUILD_CONFIG};Platform=${PLATFORM}
msbuild_rv=$?

if [ ${msbuild_rv} != 0 ]
then
    echo "MSBuild ${SLN_FILE} exited with status '${msbuild_rv}'"
    exit 1
fi

grep -q '0 Error(s)' ${MSBUILD_LOG}
if [ $? != 0 ]
then
    echo "MSBuild ${SLN_FILE} detected errors"
    exit 1
    fi

编译时,我得到重复的错误:

error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1800' in {file}.obj

这似乎是版本 1800(VS2013,我在其中创建解决方案)和 1700(VS2012,我需要编译的工具集)之间的不匹配。

我有点困惑为什么 MSBuild 没有正确执行此操作,因为我的解决方案在 VS2013 中配置正确。我需要在我的构建脚本中更改什么以确保它可以编译?

谢谢!

这里有几处错误:

  • 项目构建所用的工具集在项目本身中指定(PlatformToolset 属性 在项目文件中),而不是在命令行上调用的 vcvars 文件
  • ${CMD} /c ...命令对脚本什么都不做,你链接到的文章完全错误:它所做的是启动一个新进程,执行bat文件,然后终止。批处理文件设置的任何环境变量仅对进程是本地的,而不是调用进程。
  • 在使用 msbuild <solution> 构建之前甚至不需要调用 vcvars。 vcvars 设置了 PATH/INCLUDE/... 变量,因此您可以在命令行上手动调用编译器,但这不是您在这里所做的:您只是构建 PATH/INCLUDE/ 所在的项目。 .. 自动确定使用 PlatformToolset

所以总结以上所有内容:只需在您的解决方案上调用 msbuild 就可以了,您不需要调用 vcvars,而且我不知道为什么会出现链接器错误,因为您没有提供足够的信息可以弄清楚,但原因不在脚本中:链接器错误意味着您正在混合使用不同工具集构建的目标文件。可能您需要进行重建。只需搜索 检测到“_MSC_VER”不匹配:值与值不匹配 即可获得足够的搜索结果。