【问题标题】:Issue with using MSBuild to build a VS2012/VS2013 Project使用 MSBuild 构建 VS2012/VS2013 项目的问题
【发布时间】:2015-06-17 18:56:12
【问题描述】:

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

我目前在 cygwin 中运行这个 bash 脚本(基于这篇博文: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=$1

"${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 中配置正确。我需要在构建脚本中进行哪些更改以确保它能够编译?

谢谢!

【问题讨论】:

    标签: visual-studio-2012 visual-studio-2013 msbuild cygwin build-automation


    【解决方案1】:

    这里有几个问题:

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

    所以总结以上所有内容:只需在您的解决方案上调用 msbuild 就可以了,您不需要调用 vcvars,而且我不知道您为什么会收到链接器错误,因为您没有提供足够的信息要弄清楚这一点,但原因不在脚本中:链接器错误意味着您正在混合使用不同工具集构建的目标文件。可能您需要进行重建。仅搜索 mismatch detected for '_MSC_VER': value doesn't match value 提供了足够的搜索命中。

    【讨论】:

    • 感谢您指出这一点;我没有意识到关于vcvars!关于错误:如果从 Visual Studio 中的该解决方案/项目编译得很好,为什么会无法在命令行上编译?哪些信息有助于找出此错误的原因?
    • 不太确定。如果您从头开始创建项目并构建它,是否也存在问题?如果不是,它必须与您的项目相关,因此可能会详细说明它的结构。链接错误是否仅针对一个文件出现?你使用外部库吗?链接错误是否仅针对一个文件出现?你使用外部库吗?您是否已经尝试从命令行进行适当的重建?你有没有通过some of these 看看有没有什么铃声响起?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多