当我使用MSBuild构建Android Makefile项目并打印日志时,无法将字符串“error”和“:”放在一起

Posted

技术标签:

【中文标题】当我使用MSBuild构建Android Makefile项目并打印日志时,无法将字符串“error”和“:”放在一起【英文标题】:When I use MSBuild to build an Android Makefile project and print log, I can't put string "error" and ":" together 【发布时间】:2018-04-16 12:53:45 【问题描述】:

我写了一个脚本来构建一个android NDK应用,源码如下:

#include <stdio.h>
#include <stdlib.h>

#define LOG_ID_RADIO 1
#define ANDROID_LOG_DEBUG 3
#define LOG_TAG "TEST_LOG"

#define LOGD(...) printf(ANDROID_LOG_DEBUG,LOG_TAG ,VA_ARGS);

int main()

    size_t datalen = 0;
    LOGD("data length error: %d", datalen);  <-- Please notice the string: "error:"
    return 0;

脚本如下:

cd C:/workspace/ndkTest/ndk-build/TestCC/jni
echo ====
call ndk-build  -C C:/workspace/ndkTest/ndk-build/TestCC/jni -B
set path=C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c;%path%
echo error=%ERRORLEVEL%
pause

重现步骤:

    下载项目:testcc.zip,解压这个.zip文件,记住build.bat的位置,例如:我的build.batlocation。

    打开build.bat文件,也许你需要改变两件事:

    C:/workspace/ndkTest/ndk-build/TestCC/jni C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c

    在Visual Studio中,创建一个Android Makefile Project,右击这个项目并选择Properties,default setting,找到NMakeGeneral 构建命令行,将其更改为您的build.bat 位置,例如this。

    构建此解决方案。

当我使用字符串error:时,

LOGD("data length error: %d", datalen);

此项目将导致构建失败。错误日志:

1>------ Build started: Project: Project14, Configuration: Debug Win32 ------
1>====
1>make: Entering directory `C:/workspace/ndkTest/ndk-build/TestCC/jni'
1>[arm64-v8a] Compile        : testtime <= timetest.c
1>C:/workspace/ndkTest/ndk-build/TestCC/jni/./timetest.c(16,2): warning G5552ABC2: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
1>EXEC : LOGD("data length error : %d", datalen);
1>        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1>C:/workspace/ndkTest/ndk-build/TestCC/jni/./timetest.c:10:26: note: expanded from macro 'LOGD'
1>#define LOGD(...) printf(ANDROID_LOG_DEBUG,LOG_TAG ,__VA_ARGS__);
1>                         ^~~~~~~~~~~~~~~~~
1>C:/workspace/ndkTest/ndk-build/TestCC/jni/./timetest.c:7:27: note: expanded from macro 'ANDROID_LOG_DEBUG'
1>#define ANDROID_LOG_DEBUG 3
1>                          ^
1>C:/Users/v-shenya/AppData/Local/Android/Sdk/ndk-bundle/build//../sysroot/usr/include\stdio.h:129:24: note: passing argument to parameter '__fmt' here
1>int printf(const char* __fmt, ...) __printflike(1, 2);
1>                       ^
1>1 warning generated.
1>[arm64-v8a] Executable     : testtime
1>[arm64-v8a] Install        : testtime => libs/arm64-v8a/testtime
1>make: Leaving directory `C:/workspace/ndkTest/ndk-build/TestCC/jni'
1>error=0
1>Press any key to continue . . .
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Microsoft.MakeFile.Targets(44,5): error MSB3073: The command "C:\workspace\ndkTest\ndk-build\TestCC\jni\build.bat" exited with code -1.
1>Done building project "Project14.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

但是当我将error: 更改为error(尾随空格)或errdor: 时,它只是没有将“error”和“:”放在一起:

LOGD("data length errdor: %d", datalen);  or
LOGD("data length error  %d", datalen);

这个项目将会成功构建:

1>------ Build started: Project: Project14, Configuration: Debug Win32 ------
1>====
1>make: Entering directory `C:/workspace/ndkTest/ndk-build/TestCC/jni'
1>[arm64-v8a] Compile        : testtime <= timetest.c
1>C:/workspace/ndkTest/ndk-build/TestCC/jni/./timetest.c(16,2): warning G5552ABC2: incompatible integer to pointer conversion passing 'int' to parameter of type 'const char *' [-Wint-conversion]
1>        LOGD("data length error %d", datalen);
1>        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1>C:/workspace/ndkTest/ndk-build/TestCC/jni/./timetest.c:10:26: note: expanded from macro 'LOGD'
1>#define LOGD(...) printf(ANDROID_LOG_DEBUG,LOG_TAG ,__VA_ARGS__);
1>                         ^~~~~~~~~~~~~~~~~
1>C:/workspace/ndkTest/ndk-build/TestCC/jni/./timetest.c:7:27: note: expanded from macro 'ANDROID_LOG_DEBUG'
1>#define ANDROID_LOG_DEBUG 3
1>                          ^
1>C:/Users/v-shenya/AppData/Local/Android/Sdk/ndk-bundle/build//../sysroot/usr/include\stdio.h:129:24: note: passing argument to parameter '__fmt' here
1>int printf(const char* __fmt, ...) __printflike(1, 2);
1>                       ^
1>1 warning generated.
1>[arm64-v8a] Executable     : testtime
1>[arm64-v8a] Install        : testtime => libs/arm64-v8a/testtime
1>make: Leaving directory `C:/workspace/ndkTest/ndk-build/TestCC/jni'
1>error=0
1>Press any key to continue . . .
1>Done building project "Project14.vcxproj".
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

我的 Visual Studio 2017 版本是 15.6.6。这是 MSBuild 的错误吗?我该如何解决这个问题?

我的项目非常庞大,更改字符串error: 不是一个好主意。

【问题讨论】:

【参考方案1】:

MSBuild 会解析它执行的任何命令的输出,以获得标准化的错误或警告消息。在 bat 的输出中包含 error : 将被 MSBuild 检测为实际错误消息,并导致构建被标记为失败。

您可以看到描述此功能的 2006 年 MSBuild here 和 a blog post 的错误检测代码。

现在你有几个选项来解决这个问题:

    更改您的项目以使用Exec 命令运行带有IgnoreStandardErrorWarningFormat 属性的bat:

    <Exec Command="path/to/your/batfile.bat" IgnoreStandardErrorWarningFormat="true"></Exec>
    

    更改代码中的文本:

    LOGD("invalid data length: %d", datalen);
    

    修复导致该行首先被打印出来的编译器警告。

【讨论】:

以上是关于当我使用MSBuild构建Android Makefile项目并打印日志时,无法将字符串“error”和“:”放在一起的主要内容,如果未能解决你的问题,请参考以下文章

无法构建xamarin android项目

MSBuild 2017无法构建Cordova解决方案

Bamboo 随机运行不同版本的 msbuild.exe 并构建失败

使用 Msbuild 和 devenv 在项目解决方案下构建特定的 Visual Studio 项目

conan入门(二十六):使用make编译erpc/erpcgen(makefile)

conan入门(二十六):使用make编译erpc/erpcgen(makefile)