Ndk-build: CreateProcess: make (e=87): 参数无效

33

我在Windows平台上使用NDK构建静态库时遇到了错误:

process_begin: CreateProcess( "PATH"\android-ndk-r8b\toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ar.exe, "some other commands" ) failed.
make (e=87): The parameter is incorrect.
make: *** [obj/local/armeabi-v7a/staticlib.a] Error 87
make: *** Waiting for unfinished jobs....

所有源文件都已成功构建,但在组合对象文件时出现了此错误。

在Ubuntu中构建此项目时,我没有遇到此错误,这个错误只出现在Windows上。

我认为我找到了 问题:Win API 函数 CreateProcess 的第二个参数lpCommandLine 具有最大长度为 32,768 个字符。但在我的情况下,它超过了32,768个字符。

我该如何解决这个问题?

3个回答

36
也许在你的 Android.mk 中设置 LOCAL_SHORT_COMMANDS 标志可以帮助你。它旨在克服 Windows 命令行处理字符数量限制的限制。
根据 $(NDK folder)/docs/ANDROID-MK.html:

LOCAL_SHORT_COMMANDS

当模块具有大量源代码和/或依赖静态或共享库时,将此变量设置为“true”。

这会强制构建系统使用一个中间列表文件,并使用带有 @$(listfile) 语法的库归档程序或静态链接器。

这在 Windows 上可能很有用,因为命令行只接受最多 8191 个字符,对于复杂项目可能太小。

这也影响单个源文件的编译,将几乎所有编译器标志放入列表文件中。

请注意,除“true”以外的任何其他值都将恢复默认行为。您还可以在 Application.mk 中定义 APP_SHORT_COMMANDS,以强制所有模块在项目中使用此行为。

注意:我们不建议默认启用此功能,因为它会使构建变慢。

希望这有所帮助!

22


特别感谢@mbrenon!

请记得将LOCAL_SHORT_COMMANDS(Android.mk)和APP_SHORT_COMMANDS(Application.mk)都设置如下。

LOCAL_SHORT_COMMANDS := true
APP_SHORT_COMMANDS := true

希望这有所帮助!:)


我们可以将这些行添加到其他行的顶部吗?我有多个adroid.mk文件,我应该在所有这些文件中添加这个命令吗? - Ahmad
根据文档:您还可以在Application.mk中定义APP_SHORT_COMMANDS,以强制所有项目模块执行此行为。 - mortalis
LOCAL_SHORT_COMMANDS 变量应该放在 include $(CLEAR_VARS) 行之后。 - mortalis

1

我曾经遇到同样的问题,当我做了以下更改后,问题得到了解决

  1. 右键点击应用程序 -> 属性
  2. C/C++构建
  3. 将构建目录从${workspace_loc:/App}/Default更改为${workspace_loc:/App}/

1
有一个字符限制,你缩短了路径的字符长度。这对你来说可能没有什么意外,但对于路径太长的问题来说,这是一个相当明显的解决方法。 - Keith M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接