【问题标题】:Android ndk-build error: undefined symbol: aligned_allocAndroid ndk-build 错误:未定义符号:aligned_alloc
【发布时间】:2021-04-11 12:11:53
【问题描述】:

我正在尝试为 ImageMagick 库构建共享对象 (.so) 文件,但由于在创建 .so 文件时出现以下错误而卡住了

[arm64-v8a] Executable     : magick
ld: error: undefined symbol: aligned_alloc
>>> referenced by memory.c:262 (././ImageMagick-7.0.9-17/MagickCore\memory.c:262)
>>>               memory.o:(AcquireAlignedMemory) in archive ./obj/local/arm64-v8a/libmagickcore-7.a
>>> referenced by memory.c:262 (././ImageMagick-7.0.9-17/MagickCore\memory.c:262)
>>>               memory.o:(AcquireVirtualMemory) in archive ./obj/local/arm64-v8a/libmagickcore-7.a
>>> referenced by memory.c:262 (././ImageMagick-7.0.9-17/MagickCore\memory.c:262)
>>>               memory.o:(AcquireVirtualMemory) in archive ./obj/local/arm64-v8a/libmagickcore-7.a
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [C:/hostedtoolcache/windows/ndk/r22b/x64/build//../build/core/build-binary.mk:741: obj/local/arm64-v8a/magick] Error 1
Error: Process completed with exit code 1.

我对 c++ 有非常基本的了解,如果我遗漏了什么,欢迎提出任何建议。 这是 GitHub Actions 链接,我在其中生成 .so 文件并面临错误,以便于重现问题。

https://github.com/malaythecool/Android-ImageMagick7/runs/2316777388?check_suite_focus=true

【问题讨论】:

  • 1.你知道哪个库提供了aligned_alloc的实现吗? 2. 你知道那个库是否链接到你最终的.so吗?
  • 另外,MAGICKCORE_HAVE_STDC_ALIGNED_ALLOC 是在什么基础上定义的?这就是强制选择memory.c 中的实现选择aligned_alloc() 路由的原因。
  • aligned_alloc 实际上是 c++ 函数en.cppreference.com/w/c/memory/aligned_alloc。此外,如果我更改与 MAGICKCORE_HAVE_STDC_ALIGNED_ALLOC 相关的代码中的任何内容,就像陷入黑暗一样
  • 是的,正是我的观点。这应该可以帮助您找出可能是什么问题。 aligned_alloc() 在 C 的早期版本中不存在,因此您需要检查库,即标准 C 库,它是否在您的系统上随该实现一起提供。此外,如果您检查了 CI ././ImageMagick-7.0.9-17/MagickCore/memory.c:262:10: warning: implicit declaration of function 'aligned_alloc' is invalid in C99 [-Wimplicit-function-declaration] 中的警告。无论您要编译的哪个库都没有该功能。

标签: c++ android-ndk clang++


【解决方案1】:

从 CI 日志中显示

././ImageMagick-7.0.9-17/MagickCore/memory.c:262:10: warning: implicit declaration of function 'aligned_alloc' is invalid in C99 [-Wimplicit-function-declaration]

最终导致链接器抱怨缺少符号

ld: error: undefined symbol: aligned_alloc

尝试将标志 -std=c++1z 添加到您的构建配置中,因为 aligned_alloc() 是在 C++17 中引入的。

编辑:

似乎Application.mk 已经设置了-std=c++17 here。您是否也可以尝试添加以下标志:

APP_CONLYFLAGS += -std=c11

确保将C 标准更新为C11,其中引入了alloc_aligned()

【讨论】:

  • 没有解决,但是您的输入可能有效!查看更多关于 NDK 如何深入挑选 c++ 源代码。
  • @мalayмeнтa 添加了另一个建议,只为 C 文件传递​​标志。看看有没有帮助?
  • 是的,我只是在 Application.mk 中您的建议之后才添加的那个标志。让我立即添加新建议!
  • 弹出其他内容 ./libfftw-3.3.8/kernel/cycle.h:559:9: 错误:使用未声明的标识符 'asm' github.com/malaythecool/Android-ImageMagick7/runs/…
  • 我在上次运行时看到memory.ccompiled successfully。看看asmchange 是否也有效。添加-std=gnu99 应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多