新人发帖,求指教。
最近在进行android ndk方面的开发,在编译动态库的过程中出现了一下问题:SharedLibrary  : libXXXXX.so
make: execvp: /cygdrive/c/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-g++: Argument list too long
make: *** [obj/local/armeabi/libXXXXX.so] Error 127在网上看过一些帖子,应该是linux的问题,不过没有好的解决办法。
不知哪位高手有好的解决方案。Note: ndk version:r7b 

解决方案 »

  1.   

    从输出看,是你的参数列表太长,怀疑是 Android.mk 文件有点问题
      

  2.   


    具体来说是CPP的文件过多造成的,这个build大概有100多个CPP文件和300多个C文件,当我减少编译的CPP文件的时候就可以编译成功,但是会缺少很多实现的方法。
      

  3.   

    也许下面这个链接对你有帮助,你尝试一下吧
    http://www.meegozu.com/thread-1818-1-1.html
      

  4.   


    这个方法我已经尝试过,还是有同样的问题,而且通过通配符这样的编译的耗时很长的。
    在网上找到这样一种解决方式,虽然可以用,但是感觉不是最佳的方法。
    http://www.stonetrip.com/developer/forum/viewtopic.php?f=43&t=25517
      

  5.   

    我阅读了你说的那个链接,其实是把多个文件自动合并成一个 .cpp 文件吧;不知道下面这个办法是否可行:将代码分成多个 project,分别生成 .a 文件,最后链接成 .so 文件
      

  6.   


    这个办法也是可行的,我测试过,甚至整个工程可以编译出来一个静态库,只有在编译动态库的时候会出现上述的错误。
    但是,我需要在编译动态库的时候,加入所有的源文件,因为这个工程只是整体系统的一个中间的模块,他要想上层提供方法,并且正确的链接到他所调用下层的方法。
    所以如果按照上面的这个办法,我在编译上层的动态库的时候就会出现链接错误,关键的地方还是在于在链接动态库的时候,怎么指定LOCAL_SRC_FILES。
      

  7.   

    如果编译 .a 可行,不妨把很多代码编译成 .a,提供给上层使用的时候,链接这个 .a 就可以了下面是我调用别人实现的 .a 的配置LOCAL_SRC_FILES := xxx(少量调用 .a 的代码文件)
    LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
    LOCAL_STATIC_LIBRARIES := static_lib_name(编译好的 .a 文件的名称)
      

  8.   


    恩,直接调用静态库也是可以的,不过会出现以下问题,在此之前,我先简单的描述下整个系统的框架:
    module A,module B,module C.
    其中B就是上述无法编译出动态库的工程,A、C分别为B的下层模块和上层模块,也就是 A->B->C 这样一个架构吧。
    其中B调用了A的接口,C也会调用A中的接口。
    所以我在编译C的动态库的时候,就需要这样去写配置:
    LOCAL_STATIC_LIBRARIES := $(PATH)/libA.a
    LOCAL_STATIC_LIBRARIES += $(PATH)/libB.a
    在编译C的时候没有问题,但是,在C模块中,直接调用A和B接口的实现都可以找到,但是无法找到从B调用A的实现方法,所以在链接动态库的时候会出现错误。
      

  9.   

    建议修改成 LOCAL_STATIC_LIBRARIES := A B试一试,需要把 libA.a 和 libB.a 放在<ndk>\out\apps\<project>\armeabi 下
      

  10.   


    我并没有在application.mk中加入APP_MODULE,这种方法我会试一下,希望可以继续讨论这个问题。
      

  11.   

    android-ndk-r7b 里面编译的时候出现过这种问题,直接换成r4b 能通过  可以尝试下
      

  12.   


    貌似r4b并不支持stl吧,我需要编译的工程用std中的东西还是很多的。
      

  13.   


    <ndk>\out\apps\<project>\armeabi,这个路径是在ndk文件夹中么,我并没有找到相关类似的路径。
      

  14.   

    可能是不同编译版本吧,上面我用的版本比较旧,是 ndk-r3,如果是版本 ndk-r5,似乎路径在 android-ndk-r5\apps\<project>\project\obj\local\armeabi不知道你用的版本对应的相关目录,相信你应该能找到特别注意 .mk 文件中对于 .a 的写法,前面不需要写 lib ,后面不需要写 .a
      

  15.   


    这个路径是需要在application.mk中指定APP_MODULE,才会产生么?如果不写的话直接制定静态库的绝对路径可以么?
      

  16.   

    正在尝试用 ubuntu ,不过还在学习中。
      

  17.   

    经过实践,是cygwin的问题,在ubuntu下编译没有任何问题,结贴~~~~。
      

  18.   

    我也遇到这样的问题,我用的是r8的,用cmd编译也会报这样的错,有谁解决了的,指导下呢,感激不尽呀