Ndk-build: CreateProcess: make (e=87): The parameter is incorrect
Asked Answered
K

3

33

I get an error when build static lib with NDK on Windows platform:

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....

All source files build successfully, and this error occur when compose object files.

I don't get this error when build this project in Ubuntu, it occur only on Windows.

I suppose I found the issue: second parameter of CreateProcess Win API function lpCommandLine has max length 32,768 characters. But in my case it is more than 32,768 characters.

How I can solve this issue?

Kimberli answered 26/9, 2012 at 9:45 Comment(0)
B
36

Maybe the LOCAL_SHORT_COMMANDS flag, to be set in your Android.mk, could help you. It is designed to overcome the limitations on the number of characters a Windows command can handle.

According to $(NDK folder)/docs/ANDROID-MK.html:

LOCAL_SHORT_COMMANDS

Set this variable to 'true' when your module has a very high number of sources and/or dependent static or shared libraries. This forces the build system to use an intermediate list file, and use it with the library archiver or static linker with the @$(listfile) syntax.

This can be useful on Windows, where the command-line only accepts a maximum of 8191 characters, which can be too small for complex projects.

This also impacts the compilation of individual source files, placing nearly all compiler flags inside list files too.

Note that any other value than 'true' will revert to the default behaviour. You can also define APP_SHORT_COMMANDS in your Application.mk to force this behaviour for all modules in your project.

NOTE: We do not recommend enabling this feature by default, since it makes the build slower.

Hope this helps!

Basophil answered 4/10, 2012 at 9:35 Comment(0)
C
22


Special Thanks to @mbrenon !

Remember to set both of LOCAL_SHORT_COMMANDS(Android.mk) & APP_SHORT_COMMANDS(Application.mk) as the following.

LOCAL_SHORT_COMMANDS := true
APP_SHORT_COMMANDS := true

Hope this helps ! :)

Communication answered 14/7, 2016 at 18:30 Comment(3)
can we add these lines on the top of others ? and i have multiple adroid.mk files should i add this command in all those files ?Bounder
According to the docs: You can also define APP_SHORT_COMMANDS in your Application.mk to force this behaviour for all modules in your project.Cosher
And the LOCAL_SHORT_COMMANDS variable should be placed after the include $(CLEAR_VARS) line.Cosher
C
1

I was facing same problem and it got resolved when I made below changes

  1. Right click Application -> properties
  2. C/C++ Build
  3. Changed Build directory: ${workspace_loc:/App}/Default to ${workspace_loc:/App}/
Copulation answered 19/10, 2015 at 7:44 Comment(1)
There's a character limit, and you shortened the character length of your paths. It's not surprising this would work for you, but is a pretty obvious workaround for paths being too long.Dialogist

© 2022 - 2024 — McMap. All rights reserved.