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 上发生。

我想我发现了问题CreateProcess Win API 函数lpCommandLine的第二个参数最大长度为32,768个字符。但就我而言,它超过 32,768 个字符。

我该如何解决这个问题?

4

3 回答 3

36

也许LOCAL_SHORT_COMMANDS在你的 Android.mk 中设置的标志可以帮助你。它旨在克服 Windows 命令可以处理的字符数限制。

根据 $(NDK 文件夹)/docs/ANDROID-MK.html:

LOCAL_SHORT_COMMANDS

当您的模块具有大量源和/或依赖的静态或共享库时,将此变量设置为“true”。这会强制构建系统使用中间列表文件,并将其与库归档器或静态链接器一起使用 @$(listfile) 语法。

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

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

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

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

希望这可以帮助!

于 2012-10-04T09:35:48.223 回答
21


特别感谢@mbrenon!

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

LOCAL_SHORT_COMMANDS := true
APP_SHORT_COMMANDS := true

希望这可以帮助 !:)

于 2016-07-14T18:30:47.563 回答
1

我遇到了同样的问题,当我进行以下更改时它得到了解决

  1. 右键单击应用程序-> 属性
  2. C/C++ 构建
  3. 更改构建目录:${workspace_loc:/App}/默认为 ${workspace_loc:/App}/
于 2015-10-19T07:44:35.637 回答