Android NDK 上“__aeabi_ul2f”的多重定义(libgcc_real.a)

2023-12-28

我收到此错误multiple definition of '__aeabi_ul2f'使用 CMake 在 Android 上编译大型项目时。显然,找到定义的地方之一是

libsmoltcp_cpp_interface_rust.a(compiler_builtins-5ae026d08032e786.compiler_builtins.2kv22hwk-cgu.127.rcgu.o): previous definition here

这是一些与 C++ 混合的 Rust 代码,在 CMake 中编译如下:

add_custom_target(
    lib_smol_tcp_rust
    COMMAND 
    echo "-------------COMPILING LIBSMOLTCP_CPP_INTERFACE RELEASE x86_64"
    && cargo build --release
    && echo "-------------COMPILING LIBSMOLTCP_CPP_INTERFACE RELEASE aarch64-linux-android"
    && cargo build --target aarch64-linux-android --release 
    && echo "-------------COMPILING LIBSMOLTCP_CPP_INTERFACE RELEASE armv7-linux-androideabi"
    && cargo build --target armv7-linux-androideabi --release 
    && echo "-------------COMPILING LIBSMOLTCP_CPP_INTERFACE RELEASE i686"
    && cargo build --target i686-linux-android --release
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)

then lsmoltcp_cpp_interface_rust,这是 C++ 代码,链接到lib_smol_tcp_rust这是铁锈。

看起来像物体'__aeabi_ul2f'已经定义在libgcc_real.a来自 Android NDK 项目。

所以我不应该针对 libgcc 编译 C++/Rust 混合代码?我怎样才能做到这一点?我很困惑,因为我使用

整个错误:

  [1369/1369] Linking CXX shared library /home/dev/orwell/orwell_flutter_app/build/app/intermediates/cmake/debug/obj/armeabi-v7a/liborwell_android.so
  FAILED: /home/dev/orwell/orwell_flutter_app/build/app/intermediates/cmake/debug/obj/armeabi-v7a/liborwell_android.so 
  : && /opt/android-sdk-linux/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ --target=armv7-none-linux-androideabi24 --gcc-toolchain=/opt/android-sdk-linux/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64 --sysroot=/opt/android-sdk-linux/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security  -std=c++17 -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--exclude-libs,libunwind.a -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,liborwell_android.so -o /home/dev/orwell/orwell_flutter_app/build/app/intermediates/cmake/debug/obj/armeabi-v7a/liborwell_android.so CMakeFiles/orwell_android.dir/orwell_jni.cpp.o CMakeFiles/orwell_android.dir/DecodedFfmpegFrameJNI.cpp.o CMakeFiles/orwell_android.dir/JavaOrwellFlutterRenderer.cpp.o CMakeFiles/orwell_android.dir/MediaCodecDecoder.cpp.o CMakeFiles/orwell_android.dir/JavaSimpleFileWriter.cpp.o CMakeFiles/orwell_android.dir/JavaHashMapJNI.cpp.o CMakeFiles/orwell_android.dir/JavaFlutterEventMessenger.cpp.o  _liborwell/liborwell_static.a -landroid -llog -lmediandk /home/dev/orwell/orwell_flutter_app/android/app/src/main/cpp/../../../../../../deps/ffmpeg/build/android/armeabi-v7a/lib/libavcodec.so /home/dev/orwell/orwell_flutter_app/android/app/src/main/cpp/../../../../../../deps/ffmpeg/build/android/armeabi-v7a/lib/libavutil.so /home/dev/orwell/orwell_flutter_app/android/app/src/main/cpp/../../../../../../deps/ffmpeg/build/android/armeabi-v7a/lib/libswscale.so /home/dev/orwell/orwell_flutter_app/android/app/src/main/cpp/../../../../../../deps/ffmpeg/build/android/armeabi-v7a/lib/libswresample.so /home/dev/orwell/orwell_flutter_app/build/app/intermediates/cmake/debug/obj/armeabi-v7a/libmyRtspClient.so /home/dev/orwell/orwell_flutter_app/build/app/intermediates/cmake/debug/obj/armeabi-v7a/libjrtp.so _liborwell/_myRtspClient/libmyRtspClient-static.a _liborwell/_myRtspClient/_JTRPLIB/src/libjrtp.a _liborwell/_ZLMediaKit/libzlmediakit.a _liborwell/_ZLMediaKit/libzltoolkit.a _liborwell/_ZLMediaKit/libmpeg.a _liborwell/_ZLMediaKit/libmov.a _liborwell/_ZLMediaKit/libflv.a _liborwell/common/openvpn_zl_socket/libopenvpn_zl_socket.a _liborwell/_libopenvpn3/src/libopenvpn/libopenvpn_lib.a _liborwell/_libopenvpn3/openvpn3/libssl.a _liborwell/_libopenvpn3/openvpn3/libcrypto.a _liborwell/_libopenvpn3/openvpn3/liblzo.a _liborwell/_libopenvpn3/openvpn3/liblz4.a _liborwell/_libopenvpn3/libtins/lib/libtins.a _liborwell/_libopenvpn3/smoltcp_cpp_interface/libsmoltcp_cpp_static.a /home/dev/orwell/deps/libopenvpn3/smoltcp_cpp_interface/target/armv7-linux-androideabi/release/libsmoltcp_cpp_interface_rust.a -ldl _liborwell/common/liborwellebml/liborwell_ebml.a _liborwell/_libebml/libebml.a _liborwell/common/liborwellprofile/liborwell_profile.a _liborwell/common/liborwellprofile2/liborwell_profile2.a _liborwell/common/liborwellprofile2/_protobuf/libprotobufd.a /opt/android-sdk-linux/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libz.a -latomic -lm && :
  /opt/android-sdk-linux/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: /opt/android-sdk-linux/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/armv7-a/thumb/libgcc_real.a(_arm_addsubsf3.o): multiple definition of '__aeabi_ul2f'
  /opt/android-sdk-linux/ndk/21.1.6352462/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: /home/dev/orwell/deps/libopenvpn3/smoltcp_cpp_interface/target/armv7-linux-androideabi/release/libsmoltcp_cpp_interface_rust.a(compiler_builtins-5ae026d08032e786.compiler_builtins.2kv22hwk-cgu.127.rcgu.o): previous definition here
  clang++: error: linker command failed with exit code 1 (use -v to see invocation)                                
  ninja: build stopped: subcommand failed.    

                                         

这就是我创建 Rust 工具链的方式:

&& ${ANDROID_NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch arm64 --install-dir /opt/RUST_NDK_TOOLCHAIN/arm64 \
    && ${ANDROID_NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch arm --install-dir /opt/RUST_NDK_TOOLCHAIN/arm \
    && ${ANDROID_NDK_HOME}/build/tools/make_standalone_toolchain.py --api 26 --arch x86 --install-dir /opt/RUST_NDK_TOOLCHAIN/x86

如您所见,链接使用

--exclude-libs,libgcc_real.a

所以它不应该使用libgcc_real.a根本没有,但它以某种方式抱怨libgcc_real.a无论如何!


在链接 C/C++ 项目中的 Rust staticlib 之前,我遇到过这个问题。

让 gcc 不链接 libgcc 是非常困难的(有时是不可能的)。它被硬编码为“默认”库,链接器将始终拉取它(您可以尝试-nodefaultlibs or -nostdlib以防止这种情况发生)。也可以从链接描述文件中提取它。

对我来说,诀窍是链接器参数中的顺序很重要。

链接器的工作方式(大致)如下:

  • 所有参数都从左到右处理,每个参数仅处理一次。
  • 对于每个非-l参数时,链接器加载给定的 .a/.o 并提取所有符号,如果存在重复则出错。如果拉入的符号需要其他未在任何地方定义的符号,链接器会将它们作为“未定义的符号”进行跟踪。
  • 对于每个-l参数,链接器加载 .a 并拉入仅与先前未定义的符号匹配的符号。如果 .a 具有已定义的符号,它们将被忽略(而不是出错!)。

尝试放置libsmoltcp_cpp_interface_rust.a尽早在链接器参数中。任何-l之后的操作不会导致重复错误,因为-l忽略重复项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK 上“__aeabi_ul2f”的多重定义(libgcc_real.a) 的相关文章

  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • NoClassDefFoundError:无法解析:Landroid/support/v7/appcompat/R$styleable

    新手尝试完成 Google 提供的我的第一个应用程序教程 在这个致命异常的过程中 我确实导入了很多随机包来消除许多事情的 无法解析 错误 例如 ActionBarActivity EditText Fragment LayoutInflat
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 安卓的限制

    我需要构建一个应用程序 该应用程序拍摄相机图像并将其上传到网络 在网络上进行一些处理并返回真 假 我在这方面遇到了一些问题 希望得到澄清 1 我的应用程序有什么方法可以知道 Android 相机捕获的图像吗 我从这里明白了什么 Androi
  • Android:解析 XML 数据的最佳解析器 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开发一个应用程序 其中我第一次要解析来自远程服务器的 xml 文件中的数据 但我无法选择哪个解析器是有效的或最适合解析的 因为我知道主要有
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 使用泛型全面实现特征

    我正在通过实现矩阵数学来练习 Rust 但遇到了一些障碍 我定义了我认为与矩阵相关的特征 trait Matrix
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • Elasticsearch:组合功能分数

    我对 es 查询的评分为三functions query function score query bool score mode multiply boost mode replace functions f1 f2 f3 所以分数是 f
  • 具有特定 Order By 格式的 SQL 查询 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含以下值的表 OperationCode OperationDesc OperationOrder Repl Remove 1
  • 哪些 .Net Orms 或 MicroOrms 支持异步操作和 PostgreSql

    哪些 ORM 支持异步操作和 postgresql 我更喜欢简单的 MicroOrms 例如 Dapper 和 OrmLite 因为它们似乎具有出色的性能并且非常简单 但据我所知 它们不支持异步操作 也许我错了 但是让所有 IO 绑定操作异
  • 使用 mongoDB 聚合按文本搜索

    我正在尝试对名为的集合进行文本搜索DAFacility在 MongoDB 指南针中 id 62170597b3fa8994a0d9a0c8 author User organizationName TSTT eventName Facili
  • 表达式和变量的 C++ 类型和值类别

    由此link http en cppreference com w cpp language type 它说 对象 引用 函数 包括函数模板特化 和表达式都具有称为类型的属性 因此考虑到以下情况 int rf int 10 我可以说这个变量
  • Django的manage.py显示旧命令

    我正在编写自己的 whl 包 在创建了一些新的管理命令并删除了一些旧的命令后 我对自己非常满意 除了在构建我的轮子包之后 与setup py bdist wheel 并将其安装在我的测试服务器上 使用pip install U projec
  • 更改 Drupal 的主题并保留 Garland 作为管理主题?

    如何在不更改管理主题 站点的 contrib 主题和管理界面的 Garland 的情况下将 contrib 主题应用到 Drupal 6 站点 Thanks 转到管理 gt 站点配置 gt 管理主题 在那里 您可以设置管理主题 如果您想对管
  • 使用 inno setup 卸载默认图标

    我正在使用 Inno setup 将卸载图标添加到 开始 菜单文件夹 using the Inno Setup Script Wizard example My program there is a default uninstall ic
  • 无论锁定状态如何写入锁定文件

    有没有办法写入锁定的文件 无论它打开哪个程序 进程 设想 作为服务运行的商业产品会锁定日志文件 服务不能停止 因为这会影响客户 想在文件末尾插入一行作为标记 出现错误 该进程无法访问该文件 因为该文件正在被另一个进程使用 有什么方法可以在锁
  • 如何从 C 文件中获取完整的汇编代码?

    我目前正在尝试找出从相应的 C 源文件生成等效汇编代码的方法 我使用 C 语言已经好几年了 但对汇编语言的经验很少 我能够使用以下命令输出汇编代码 S海湾合作委员会中的选项 然而 生成的汇编代码包含调用指令 这些指令又跳转到另一个函数 例如
  • ActiveRecord find_each 结合 limit 和 order

    我正在尝试使用 ActiveRecord 运行大约 50 000 条记录的查询find each方法 但它似乎忽略了我的其他参数 如下所示 Thing active order created at DESC limit 50000 fin
  • 什么时候在函数外部返回值使用移动与复制?

    读完这篇文章后question https stackoverflow com questions 11914691 copy elision move constructor not called when using ternary e
  • Facebook Open Graph API - og:元标签被忽略

    我正在解决页面标题和图像未包含在 Facebook 点赞中的问题 使用 OG 调试器后 看起来没有og Facebook 正在访问元标签 它说它正在推断og url and og title页面上存在的属性 作为测试 我直接从开发人员文档的
  • 类型错误:无法读取未定义的“想要”属性:

    我一整天都在使用 firebase 成功部署功能 学习如何使用它 我试图看看如果我初始化了另一个部署到同一个项目的目录并且没有任何问题 直到我更新了我的 npm 版本 现在每当我尝试部署时都会收到 发生意外错误 我尝试通过让我自己的用户成为
  • 如何在Listview的OnClickListener中获取被点击项目的位置?

    我想在列表视图上获取选定的列表视图项目 onclick 侦听器 现在我已经实施了onItemClickListener但是当我单击某个项目文本时 它就会被提升 我想在列表视图行单击时引发它 知道如何实现这一目标吗 要获取列表 onClick
  • C# 从 IP 地址字符串中删除尾随“\0”

    我通过 TCP 套接字收到了一个字符串 这个字符串看起来像这样 str 10 100 200 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 我应该如何将其解析为 IP 地址 如果我这样做 IPAddress TryPa
  • Spring Cloud Stream 和 RabbitMQ 健康检查

    我有一个使用 Spring Cloud Stream Rabbit 和 Eureka Discovery Client 的简单 Spring Boot 应用程序 该应用程序与 Eureka Server 一起工作正常 并且通过 Rabbit
  • 当 WKExtension.scheduleBackgroundRefresh 应该调用 ScheduledCompletion 处理程序时?

    我正在尝试用这样的行安排后台任务 WKExtension shared scheduleBackgroundRefresh withPreferredDate Date timeIntervalSinceNow TimeInterval 5
  • 我应该向 Proxy.newProxyInstance(...) 提供哪个类加载器?

    我已阅读文档 但我仍然不明白应该提供哪个类加载器作为参数 我尝试了一些选项 但这似乎对编译或代理的行为没有影响 有点令人不安的是 我可以传递任何内容作为类加载器参数 包括null 并且代码仍然可以正常工作 谁能解释一下这一点 并告诉我如果我
  • Android NDK 上“__aeabi_ul2f”的多重定义(libgcc_real.a)

    我收到此错误multiple definition of aeabi ul2f 使用 CMake 在 Android 上编译大型项目时 显然 找到定义的地方之一是 libsmoltcp cpp interface rust a compil