`ndk-build`将`LOCAL_PATH`作为源文件处理

时间:2017-06-28 06:18:57

标签: android makefile android-ndk

运行ndk-build时出现以下错误:

[armeabi-v7a-hard] Executable     : simpleFlow
/opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: fatal error: jni/../jni/../: pread failed: Is a directory
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [obj/local/armeabi-v7a/simpleFlow] Error 1

启用详细标记,似乎jni/../jni/../(即我的LOCAL_PATH)被错误地视为源文件:

[armeabi-v7a-hard] Executable     : simpleFlow
Android clang version 3.8.275480  (based on LLVM 3.8.275480)
Target: armv7-none-linux-android
Thread model: posix
InstalledDir: /opt/android-ndk-r14b/toolchains/llvm/prebuilt/linux-x86_64/bin
Found candidate GCC installation: /opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x
Selected GCC installation: /opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x
Candidate multilib: thumb;@thumb
Candidate multilib: armv7-a;@armv7
Candidate multilib: armv7-a/thumb;@armv7@thumb
Candidate multilib: .;
Selected multilib: armv7-a;@armv7
 "/opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld" --sysroot=/opt/android-ndk-r14b/platforms/android-9/arch-arm -pie -z relro -X --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /system/bin/linker -o ./obj/local/armeabi-v7a/simpleFlow /opt/android-ndk-r14b/platforms/android-9/arch-arm/usr/lib/../lib/crtbegin_dynamic.o -L/opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a -L/opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/../lib/armv7-a -L/opt/android-ndk-r14b/platforms/android-9/arch-arm/usr/lib/../lib -L/opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/lib/armv7-a -L/opt/android-ndk-r14b/platforms/android-9/arch-arm/usr/lib --gc-sections -z nocopyreloc -rpath-link=/opt/android-ndk-r14b/platforms/android-9/arch-arm/usr/lib -rpath-link=./obj/local/armeabi-v7a ./obj/local/armeabi-v7a/objs/simpleFlow/jni/__/jni/__/src/test.o jni/../jni/../ jni/../jni/../lib/libopenblas.a /opt/android-ndk-r14b/sources/cxx-stl/stlport/libs/armeabi-v7a/libstlport_static.a -lgcc --fix-cortex-a8 --no-warn-mismatch -lm_hard --build-id --no-undefined -z noexecstack -z relro -z now --warn-shared-textrel --fatal-warnings -lc -lm -lstdc++ -lm -lgcc -lgcc -ldl -lc -lgcc -lgcc -ldl /opt/android-ndk-r14b/platforms/android-9/arch-arm/usr/lib/../lib/crtend_android.o
/opt/android-ndk-r14b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: fatal error: jni/../jni/../: pread failed: Is a directory
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [obj/local/armeabi-v7a/simpleFlow] Error 1

这是我的jni/Android.mk

LOCAL_PATH := $(call my-dir)/..

include $(CLEAR_VARS)

LOCAL_MODULE := openblas
LOCAL_SRC_FILES += $(LOCAL_PATH)/lib/libopenblas.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := simpleFlow
LOCAL_SRC_FILES += $(LOCAL_PATH)/src/test.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src $(LOCAL_PATH)/include
LOCAL_STATIC_LIBRARIES := openblas

LOCAL_CFLAGS := -pie -fPIE -O3 -ftree-vectorize -std=c++11 -mfloat-abi=hard -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -v
LOCAL_LDFLAGS := -pie -fPIE -v -Wl,--no-warn-mismatch -lm_hard

TARGET_PLATFORM := android-20
TARGET_ARCH_ABI := armeabi-v7a-hard
APP_ABI := armeabi-v7a-hard

include $(BUILD_EXECUTABLE)

以下是项目根路径下的文件:

.
├── bin
├── include
│   ├── cblas.h
│   ├── f77blas.h
│   ├── lapacke_config.h
│   ├── lapacke.h
│   ├── lapacke_mangling.h
│   ├── lapacke_utils.h
│   └── openblas_config.h
├── jni
│   ├── Android.mk
│   ├── Application.mk
├── lib
│   ├── cmake
│   │   └── openblas
│   ├── libopenblas.a -> libopenblas_armv7p-r0.2.20.dev.a
│   ├── libopenblas_armv7p-r0.2.20.dev.a
│   └── pkgconfig
└── src
    └── test.cpp

我认为Android.mk一定有问题。但在谷歌搜索类似的问题后,我仍然没有找到答案。

编辑:

感谢@mstorsjo的建议,我找到了一种方法让它工作: 将LOCAL_SRC_FILES += $(LOCAL_PATH)/lib/libopenblas.a替换为LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/libopenblas.a。有没有合理的解释?

顺便说一句。我使用$(warning $(LOCAL_SRC_FILES))检查分配前后的变量LOCAL_SRC_FILESLOCAL_SRC_FILES += $(LOCAL_PATH)/lib/libopenblas.aLOCAL_SRC_FILES := $(LOCAL_PATH)/lib/libopenblas.a会产生相同的结果。

编辑:

LOCAL_SRC_FILESLOCAL_SRC_FILES += $(LOCAL_PATH)/lib/libopenblas.a生成的LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/libopenblas.a实际上是不同的。

请参阅下图(左侧:LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/libopenblas.a,右侧:LOCAL_SRC_FILES += $(LOCAL_PATH)/lib/libopenblas.a):

On the left: <code>LOCAL_SRC_FILES := $(LOCAL_PATH)/lib/libopenblas.a</code>, on the right: <code>LOCAL_SRC_FILES += $(LOCAL_PATH)/lib/libopenblas.a</code>

1 个答案:

答案 0 :(得分:2)

不确定这是否是您遇到的实际问题,但至少存在一个奇怪的问题:LOCAL_SRC_FILES中的文件名隐含地与LOCAL_PATH相关,因此您应该将其删除简单地LOCAL_SRC_FILES += lib/libopenblas.a(和LOCAL_SRC_FILES += src/test.cpp类似)。由于您的LOCAL_PATHjni/..,因此额外的重复似乎并没有受到伤害。

虽然我不确定这是否会解释并修复你的额外jni/../jni/../的案例作为一个单独的词,这是你所面临的主要问题,但它至少值得一试。

您可能还想尝试使用:=代替+=进行分配,如果这也有帮助的话。