Android `ndk build`treates`LOCAL_PATH`作为源文件

Android `ndk build`treates`LOCAL_PATH`作为源文件,android,makefile,android-ndk,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/../j

当我运行
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
打开verbose标志,似乎
jni/./jni/./
(即我的
本地路径
)被错误地视为源文件:

[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\u SRC\u FILES+=$(LOCAL\u PATH)/lib/libopenblas.a
替换为
LOCAL\u SRC\u FILES:=$(LOCAL\u PATH)/lib/libopenblas.a
。有什么合理的解释吗

顺便说一句,我使用
$(warning$(LOCAL\u SRC\u FILES))
在赋值前后检查变量
LOCAL\u SRC\u FILES
LOCAL\u SRC\u FILES+=$(LOCAL\u PATH)/lib/libopenblas.a
LOCAL\u SRC\u FILES:=$(LOCAL\u PATH)/lib/libopenblas.a
产生相同的结果


编辑:

LOCAL\u SRC\u FILES+=$(LOCAL\u PATH)/lib/libopenblas.a产生的
LOCAL\u SRC\u文件
LOCAL\u SRC\u文件:=$(LOCAL\u PATH)/lib/libopenblas.a
实际上是不同的

请参见下图(左侧:
LOCAL\u SRC\u FILES:=$(LOCAL\u PATH)/lib/libopenblas.a
,右侧:
LOCAL\u SRC\u FILES+=$(LOCAL\u PATH)/lib/libopenblas.a
):


不确定这是否是您遇到的实际问题,但至少有一个奇怪的地方:
LOCAL\u SRC\u文件
中的文件名与
LOCAL\u路径
隐式相关,因此您应该删除它,并使其简单化为
LOCAL\u SRC\u FILES+=lib/libopenblas.a
(类似地,
LOCAL\u SRC\u FILES+=SRC/test.cpp
)。由于您的案例中的
LOCAL\u PATH
jni/。
,因此额外的重复似乎不会造成伤害

虽然我不确定这是否能解释并修复您将额外的
jni/./././.
作为一个单独的词的情况,这是您面临的主要问题,但至少值得一试


如果这也有帮助的话,您可能还想尝试使用
:=
而不是
+=
来完成分配。

不确定这是否是您遇到的实际问题,但至少有一个奇怪之处:
本地\u SRC\u文件中的文件名与
本地路径
隐式相关,因此您应该删除t简单地说就是
LOCAL\u SRC\u FILES+=lib/libopenblas.a
(同样地
LOCAL\u SRC\u FILES+=SRC/test.cpp
)。因为在您的例子中
LOCAL\u PATH
jni/。
,所以额外的重复似乎没有什么坏处

虽然我不确定这是否能解释并修复您将额外的
jni/./././.
作为一个单独的词的情况,这是您面临的主要问题,但至少值得一试


如果在这里也有帮助的话,你可能还想尝试使用
:=
而不是
+=
来完成作业。

谢谢你的回答。在
本地SRC\u文件中删除
本地路径后会出现相同的错误。但是,用
+=/code>替换
:=/code>可以让它工作(要指定,请使用
LOCAL\u SRC\u文件:=$(LOCAL\u PATH)/lib/libopenblas.a
)。有什么合理的解释吗?后面有一个操作在
$(LOCAL\u PATH)前面加上前缀
LOCAL\u SRC\u文件中的所有单个单词
。如果您使用
:=
进行初始赋值,我认为该变量会被清除,并且不会在开始时以任何额外的空格开始,而如果您使用
+=
附加到它,它似乎会以空格开始。因此我建议仅在以下情况下使用
+=
实际上,您已经在变量中输入了一些内容。特别是对于
预构建的\u STATIC\u库
,您将只有一个源文件。即使使用
:=
,我建议删除额外的
$(本地路径)
LOCAL\u SRC\u文件的内容中获取。恰好它对您有效。在这种情况下,此变量不应包含
$(LOCAL\u PATH)
。你说得对。我以前没有注意到
本地路径中有额外的空间。:joy:这很有意义。非常感谢你的帮助!谢谢你的回答。在
本地SRC\u文件中删除
本地路径后会出现相同的错误。但是,用
+=/code>替换
:=
可以使它可以工作(待指定,使用
LOCAL\u SRC\u文件:=$(LOCAL\u PATH)/lib/libopenblas.a
)。有什么合理的解释吗?后面有一个操作会在
$(LOCAL\u PATH)前面加上前缀
LOCAL\u SRC\u文件中的所有单个单词
。如果您使用
:=
进行初始赋值,我认为该变量会被清除,并且不会在开始时以任何额外的空格开始,而如果您使用
+=
附加到它,它似乎会以空格开始。因此我建议仅在以下情况下使用
+=
实际上,您已经在变量中输入了一些内容。特别是对于
预构建的\u STATIC\u库
,您将只有一个源文件。即使使用
:=
,我建议删除额外的
$(本地路径)
LOCAL\u SRC\u文件的内容中获取。恰好它对您有效。在这种情况下,此变量不应包含
$(LOCAL\u PATH)
。你说得对。我以前没有注意到
本地路径中有多余的空间。
:乔伊:这很有道理。非常感谢你的友好帮助!