ndk-build 出现undefined reference to `__android_log_write'错误

本文详细介绍了在Android开发过程中遇到的关于Android.mk文件配置的问题,特别是如何正确配置LOCAL_LDLIBS参数以引入liblog库,从而避免编译错误。通过给出具体的例子和解释,帮助开发者解决在集成log功能时可能遇到的常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

__android_log_write(ANDROID_LOG_INFO,"MyNdkDemo", "class Point not found");

.c文件中存在此句代码,当使用ndk-build是就会出现标题错误。

解决:

       mk文件中缺少了LOCAL_LDLIBS参数。

在Android.mk文件里,可以指定一个LOCAL_LDLIBS的参数。如果不指定,那么编译的时候,只会引入默认的几个重要的lib,比如libc之类的。

如果要用log,那就要把 liblog给引进来。

网上很多的写法是 LOCAL_LDLIBS := -llog ,这在build static lib的时候没什么问题。如果是build shared lib,就会报个 cannot find -llog的错误。意思是找不到liblog.so这个库文件。

因此需要改成 LOCAL_LDLIBS :=  -L$(SYSROOT)/usr/lib -llog 才可以正常编译。

其中-L参数是指定了搜索lib的路径。

下面是一个android.mk的内容的例子:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := TestNdkNetwork

LOCAL_SRC_FILES := HttpConnection.cpp

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog(llog 是哪个库?是不是打错了?是liblog)

include $(BUILD_SHARED_LIBRARY)


FAILED: lib/libInspireFace.so cmd.exe /C "cd . && D:\android\Android\Sdk\ndk\25.2.9519653\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android21 --sysroot=D:/android/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -g0 -std=c++14 -O3 -O3 -mfpu=neon -O3 -DNDEBUG -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections -shared -Wl,-soname,libInspireFace.so -o lib\libInspireFace.so @CMakeFiles\InspireFace.rsp && cd ." ld: error: undefined symbol: HFLaunchInspireFace >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GlobalLaunch) ld: error: undefined symbol: HFTerminateInspireFace >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GlobalTerminate) ld: error: undefined symbol: HFQueryInspireFaceLaunchStatus >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_QueryLaunchStatus) ld: error: undefined symbol: HFCreateInspireFaceSession >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_CreateSession) ld: error: undefined symbol: HFReleaseInspireFaceSession >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_ReleaseSession) ld: error: undefined symbol: HFCreateImageStream >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_CreateImageStreamFromBitmap) >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_CreateImageStreamFromByteBuffer) ld: error: undefined symbol: HFDeBugImageStreamDecodeSave >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_WriteImageStreamToFile) ld: error: undefined symbol: HFReleaseImageStream >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_ReleaseImageStream) ld: error: undefined symbol: HFExecuteFaceTrack >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_ExecuteFaceTrack) ld: error: undefined symbol: HFGetNumOfFaceDenseLandmark >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GetFaceDenseLandmarkFromFaceToken) ld: error: undefined symbol: HFGetFaceDenseLandmarkFromFaceToken >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GetFaceDenseLandmarkFromFaceToken) ld: error: undefined symbol: HFFaceFeatureExtract >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_ExtractFaceFeature) ld: error: undefined symbol: HFFaceGetFaceAlignmentImage >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GetFaceAlignmentImage) ld: error: undefined symbol: HFImageBitmapGetData >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GetFaceAlignmentImage) ld: error: undefined symbol: HFReleaseImageBitmap >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GetFaceAlignmentImage) >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_GetFaceAlignmentImage) ld: error: undefined symbol: HFSessionSetTrackPreviewSize >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_SetTrackPreviewSize) ld: error: undefined symbol: HFSessionSetFilterMinimumFacePixelSize >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_SetFilterMinimumFacePixelSize) ld: error: undefined symbol: HFSessionSetFaceDetectThreshold >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_SetFaceDetectThreshold) ld: error: undefined symbol: HFSessionSetTrackModeSmoothRatio >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_SetTrackModeSmoothRatio) ld: error: undefined symbol: HFSessionSetTrackModeNumSmoothCacheFrame >>> referenced by inspireface_jni.cpp >>> cpp/inspireface/CMakeFiles/InspireFace.dir/platform/jni/android/inspireface_jni.cpp.o:(Java_com_insightface_sdk_inspireface_InspireFace_SetTrackModeNumSmoothCacheFrame) ld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors) clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. Build-AndroidArch : Ninja 编译失败! 所在位置 D:\insightface-master\insightface-master\cpp-package\inspireface\command\build_android.ps1:247 字符: 1 + Build-AndroidArch "arm64-v8a" 21 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Build-AndroidArch
最新发布
08-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值