解决Ubuntu下AndroidStudio中gradle process run很久的问题

打开Gradle console会出现错误:

error while loading shared libraries: libz.so.1


执行命令:

sudo apt-get install zlib1g:i386

Execution failed for task ':app:buildCMakeDebug[x86_64]'. > com.android.ide.common.process.ProcessException: ninja: Entering directory `U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64' [1/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libstringUtils.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/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 -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libstringUtils.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: MD5_Init >>> referenced by stringUtils.cpp:19 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:19) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:buildCMakeDebug[x86_64]'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130) at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) Caused by: org.gradle.internal.UncheckedException: com.android.ide.common.process.ProcessException: ninja: Entering directory `U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64' [1/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libstringUtils.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/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 -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libstringUtils.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: MD5_Init >>> referenced by stringUtils.cpp:19 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:19) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Update >>> referenced by stringUtils.cpp:20 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:20) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Final >>> referenced by stringUtils.cpp:21 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:21) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) [2/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libproject.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/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 -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libproject.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so CMakeFiles/project.dir/project/project.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&) >>> referenced by project.cpp:37 (U:/code/Android/AutoMate/app/src/main/cpp/project/project.cpp:37) >>> CMakeFiles/project.dir/project/project.cpp.o:(Project::getName(_JNIEnv*, _jobject*)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. C++ build system [build] failed while executing: @echo off "U:\\Tools\\Android\\SDK\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "U:\\code\\Android\\AutoMate\\app\\.cxx\\Debug\\4b6u6p29\\x86_64" ^ automate ^ fileShard ^ fileUtils ^ javaUtils ^ project ^ stringUtils from U:\code\Android\AutoMate\app at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69) at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:128) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:244) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229) at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212) at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195) at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162) at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29) at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) at org.gradle.internal.Either$Right.fold(Either.java:175) at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:105) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:54) at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64) at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43) at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125) at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:56) at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289) at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35) at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) Caused by: com.android.ide.common.process.ProcessException: ninja: Entering directory `U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64' [1/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libstringUtils.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/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 -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libstringUtils.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: MD5_Init >>> referenced by stringUtils.cpp:19 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:19) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Update >>> referenced by stringUtils.cpp:20 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:20) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Final >>> referenced by stringUtils.cpp:21 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:21) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) [2/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libproject.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/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 -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libproject.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so CMakeFiles/project.dir/project/project.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&) >>> referenced by project.cpp:37 (U:/code/Android/AutoMate/app/src/main/cpp/project/project.cpp:37) >>> CMakeFiles/project.dir/project/project.cpp.o:(Project::getName(_JNIEnv*, _jobject*)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. C++ build system [build] failed while executing: @echo off "U:\\Tools\\Android\\SDK\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "U:\\code\\Android\\AutoMate\\app\\.cxx\\Debug\\4b6u6p29\\x86_64" ^ automate ^ fileShard ^ fileUtils ^ javaUtils ^ project ^ stringUtils from U:\code\Android\AutoMate\app at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.execute(ExecuteProcess.kt:288) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt$executeProcess$1.invoke(ExecuteProcess.kt:108) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt$executeProcess$1.invoke(ExecuteProcess.kt:106) at com.android.build.gradle.internal.cxx.timing.TimingEnvironmentKt.time(TimingEnvironment.kt:32) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.executeProcess(ExecuteProcess.kt:106) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.executeProcess$default(ExecuteProcess.kt:85) at com.android.build.gradle.internal.cxx.build.CxxRegularBuilder.executeProcessBatch(CxxRegularBuilder.kt:332) at com.android.build.gradle.internal.cxx.build.CxxRegularBuilder.build(CxxRegularBuilder.kt:129) at com.android.build.gradle.tasks.ExternalNativeBuildTask.doTaskAction(ExternalNativeBuildTask.kt:72) at com.android.build.gradle.internal.tasks.UnsafeOutputsTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:78) at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51) at com.android.build.gradle.internal.tasks.UnsafeOutputsTask.taskAction(UnsafeOutputsTask.kt:81) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125) ... 116 more Caused by: com.android.ide.common.process.ProcessException: Error while executing process U:\Tools\Android\SDK\cmake\3.22.1\bin\ninja.exe with arguments {-C U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64 automate fileShard fileUtils javaUtils project stringUtils} at com.android.build.gradle.internal.process.GradleProcessResult.buildProcessException(GradleProcessResult.java:73) at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:48) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.execute(ExecuteProcess.kt:277) ... 129 more Caused by: org.gradle.process.internal.ExecException: Process 'command 'U:\Tools\Android\SDK\cmake\3.22.1\bin\ninja.exe'' finished with non-zero exit value 1 at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:442) at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:46) ... 130 more BUILD FAILED in 1s 33 actionable tasks: 2 executed, 31 up-to-date
最新发布
11-28
<think> 我们面对的问题是:在构建安卓项目时,执行 ':app:buildCMakeDebug[x86_64]' 任务失败,错误为链接时出现未定义符号(MD5_Init、MD5_Update、MD5_Final 以及 StringUtils::getStringMd5)。该项目使用 NDK 27.0.12077973 和 CMake 3.22.1。 分析: 1. MD5_Init, MD5_Update, MD5_Final 是OpenSSL库中MD5相关的函数。 2. StringUtils::getStringMd5 可能是项目中自定义的一个函数,它内部调用了MD5系列函数。 因此,问题可能有两个方面: a) 项目没有正确链接OpenSSL的crypto库(包含MD5函数)。 b) 项目中的StringUtils类(包含getStringMd5函数)没有正确编译或链接。 根据之前提供的CMake配置指南,我们重点检查OpenSSL的链接配置。 步骤: 1. 确认OpenSSL库是否已正确添加到项目中(包括头文件和库文件)。 2. 检查CMakeLists.txt中是否正确配置了OpenSSL的链接。 参考引用[1]和[3],我们得知用户使用了NDK版本27.0.12077973,并且可能需要交叉编译OpenSSL。但问题中未定义符号表明链接阶段未找到这些符号,所以我们需要确保: - 在CMakeLists.txt中链接了crypto库(动态或静态)。 - 库文件的ABI(x86_64)与当前构建的ABI匹配。 解决方案: ### 一、检查OpenSSL库的配置 1. **目录结构**:确保OpenSSL库文件(.so或.a)放置在正确的jniLibs目录下,并且按照ABI分类。例如: ``` src/main/jniLibs/x86_64/libcrypto.so src/main/jniLibs/x86_64/libssl.so ``` 注意:因为错误发生在x86_64架构上,所以必须确保x86_64目录存在且包含所需的库文件。 2. **CMakeLists.txt配置**:参考之前提供的配置,添加以下内容: ```cmake # 设置OpenSSL头文件路径 include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include/openssl) # 导入预编译的OpenSSL动态库(以动态库为例) add_library(crypto SHARED IMPORTED) set_target_properties(crypto PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.so) add_library(ssl SHARED IMPORTED) set_target_properties(ssl PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libssl.so) # 在链接目标时添加crypto target_link_libraries(native-lib crypto ssl ... # 其他库 ) ``` 注意:如果使用的是静态库,则需将`SHARED`改为`STATIC`,并将文件扩展名改为`.a`。 3. **检查ABI**:确保构建的ABI(x86_64)在jniLibs下有对应的目录,并且库文件与ABI匹配。 ### 二、检查StringUtils类的实现和编译 1. 确保包含`getStringMd5`函数的源文件(比如`StringUtils.cpp`)已经添加到`add_library`中: ```cmake add_library(native-lib SHARED src/main/cpp/native-lib.cpp src/main/cpp/StringUtils.cpp # 确保包含这个文件 ) ``` 2. 在`StringUtils.cpp`中,检查是否包含了正确的头文件以使用MD5函数: ```cpp #include <openssl/md5.h> ``` ### 三、解决OpenSSL版本兼容性问题 如果使用的是OpenSSL 3.0及以上版本,注意MD5函数位于legacy库中。在OpenSSL 3.0中,一些较旧的算法被移到了legacy provider。因此,除了链接crypto库,可能还需要启用legacy provider。 但是,在链接阶段,我们只需要确保链接了包含这些符号的库(在OpenSSL 3.0中,MD5函数仍然在libcrypto中,但可能会依赖于legacy provider)。因此,链接阶段通常只需要libcrypto.so即可。但在运行时,可能需要加载legacy provider。 因此,链接阶段未定义符号的问题,通常还是因为没链接到libcrypto。但是,如果确认库文件存在且包含这些符号,则可能是库文件本身的问题(比如编译OpenSSL时没有启用MD5)。 ### 四、验证库文件 使用`nm`工具检查libcrypto.so中是否包含这些符号(在x86_64的libcrypto.so上运行): ``` nm -gD libcrypto.so | grep MD5_Init ``` 应该能看到类似: ``` 00000000000d1e70 T MD5_Init ``` 如果没有,说明OpenSSL库编译时没有包含MD5(不太可能,因为MD5是基本功能),或者库文件损坏。 ### 五、其他可能 1. **链接顺序**:确保在`target_link_libraries`中,crypto库放在依赖它的库之后(即如果native-lib依赖crypto,那么crypto应该放在native-lib之后,但实际上CMake会处理依赖,但有时顺序也很重要)。建议将crypto放在依赖它的库的后面(即native-lib后面)。 2. **多个库冲突**:如果项目中还有其他库使用了OpenSSL,可能会导致冲突。确保整个项目使用同一个版本的OpenSSL。 3. **NDK版本一致性**:参考引用[1][2],确保在Ubuntu(或编译OpenSSL的环境)中使用的NDK版本与Android Studio中使用的NDK版本一致(都是27.0.12077973)。 4. **CMake版本**:确保CMake版本兼容,但3.22.1应该是较新的,一般问题不大。 ### 六、临时解决方案(不推荐) 如果问题依然存在,可以考虑在项目中直接包含MD5的实现(例如,从OpenSSL中抽取MD5的代码)以避免链接问题。 ### 配置示例 以下是一个针对x86_64架构的CMakeLists.txt配置示例(假设使用动态库): ```cmake cmake_minimum_required(VERSION 3.4.1) # 设置头文件路径 include_directories( ${CMAKE_SOURCE_DIR}/src/main/cpp/include # 这里包含StringUtils.h等头文件 ${CMAKE_SOURCE_DIR}/src/main/cpp/include/openssl # OpenSSL头文件 ) # 添加原生库,包含StringUtils.cpp add_library(native-lib SHARED src/main/cpp/native-lib.cpp src/main/cpp/StringUtils.cpp ) # 导入OpenSSL的crypto库(x86_64) add_library(crypto SHARED IMPORTED) set_target_properties(crypto PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/x86_64/libcrypto.so) # 链接 target_link_libraries(native-lib crypto log ) ``` 注意:这里我们显式指定了x86_64的路径(仅用于示例,实际建议使用${ANDROID_ABI}变量,这样CMake会根据当前构建的ABI自动选择路径)。 最后,构建项目,看是否解决。 如果问题仍然存在,请检查: - 是否在正确的构建变体(debug/release)下? - 是否清理过项目(Build -> Clean Project)? 通过以上步骤,应该能解决未定义符号的问题。 §§相关问题§§ 1. 如何为Android交叉编译OpenSSL动态库? 2. 如何在CMake中管理多个第三方库的依赖关系? 3. OpenSSL 3.0的legacy provider在JNI中如何正确初始化和卸载? 4. 如何验证APK中是否包含所需的OpenSSL符号? </think>### 解决安卓NDK构建未定义符号错误(MD5_Init等)的完整指南 #### 问题分析 链接错误表明以下符号未找到: 1. `MD5_Init`, `MD5_Update`, `MD5_Final`:属于OpenSSL的MD5函数 2. `StringUtils::getStringMd5`:项目自定义函数 主要原因是OpenSSL库未正确链接或配置错误[^3]。 #### 解决方案 ##### 1. 检查OpenSSL库配置(CMakeLists.txt) ```cmake cmake_minimum_required(VERSION 3.4.1) # 添加头文件路径(根据实际路径修改) include_directories( ${CMAKE_SOURCE_DIR}/src/main/cpp/openssl/include ) # 添加动态库(推荐) add_library(crypto SHARED IMPORTED) set_target_properties(crypto PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.so) # 链接到目标库 target_link_libraries(your_target_name crypto log) # 静态库备用方案(如动态库无效) add_library(crypto_static STATIC IMPORTED) set_target_properties(crypto_static PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.a) ``` ##### 2. 验证目录结构 确保文件路径正确: ``` src/main/ ├── jniLibs/ │ ├── x86_64/ # 对应报错的ABI │ │ ├── libcrypto.so │ │ └── libssl.so ├── cpp/ │ ├── openssl/ # OpenSSL头文件 │ │ ├── include/ │ │ │ ├── openssl/ │ │ │ │ ├── md5.h │ │ │ │ └── ... ``` ##### 3. 检查NDK版本一致性(关键!) 在`build.gradle`中强制指定NDK版本: ```groovy android { ndkVersion "27.0.12077973" // 与引用[1][2]保持一致 defaultConfig { externalNativeBuild { cmake { abiFilters 'x86_64' // 针对报错架构 arguments "-DANDROID_STL=c++_shared" } } } } ``` ##### 4. 解决自定义函数问题 检查`StringUtils`类的实现: ```cpp // StringUtils.cpp #include <openssl/md5.h> // 确保包含此头文件 std::string StringUtils::getStringMd5(const std::string& input) { MD5_CTX context; MD5_Init(&context); // 确保使用正确 // ... } ``` 在CMake中添加源文件: ```cmake add_library(native-lib SHARED src/main/cpp/StringUtils.cpp # 添加此文件 ...) ``` ##### 5. 符号导出增强配置 在CMakeLists.txt添加: ```cmake # 解决未定义符号问题 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--export-dynamic") ``` #### 验证步骤 1. **清理构建**: ```bash ./gradlew clean rm -rf .cxx/ build/ ``` 2. **检查库文件符号**: ```bash # 在Linux/Mac上运行 nm -gD src/main/jniLibs/x86_64/libcrypto.so | grep MD5_Init ``` 应输出类似:`00000000000d1e70 T MD5_Init` 3. **检查APK内容**: 使用Android Studio的APK分析器查看lib/ x86_64 / 中是否包含: - libcrypto.so - 项目对应的native-lib.so #### 常见错误排查表 | 错误现象 | 解决方案 | |---------|---------| | **"undefined MD5_Init"** | 确认`target_link_libraries`包含crypto | | **"File not found: openssl/md5.h"** | 检查`include_directories`路径 | | **ABI不匹配错误** | 确保jniLibs下有x86_64目录 | | **多重定义错误** | 避免同时链接静态和动态库 | > **提示**:OpenSSL 3.0+用户需添加: > ```cmake > add_definitions(-DOPENSSL_API_COMPAT=0x10100000L) > target_link_libraries(your_target_name dl) # 添加动态加载支持 > ``` 通过以上步骤,可解决未定义符号问题。若仍有问题,请检查OpenSSL库是否使用相同NDK版本编译[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值