当我使用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.bat
location。
打开build.bat
文件,也许你需要改变两件事:
C:/workspace/ndkTest/ndk-build/TestCC/jni
C:\ProgramData\Microsoft\AndroidNDK64\android-ndk-r15c
在Visual Studio中,创建一个Android Makefile Project,右击这个项目并选择Properties,default setting,找到NMake → General → 构建命令行,将其更改为您的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”和“:”放在一起的主要内容,如果未能解决你的问题,请参考以下文章
Bamboo 随机运行不同版本的 msbuild.exe 并构建失败
使用 Msbuild 和 devenv 在项目解决方案下构建特定的 Visual Studio 项目