【问题标题】:What is causing c++ function signature to be different?是什么导致 c++ 函数签名不同?
【发布时间】:2021-05-16 12:41:12
【问题描述】:

我们的构建机器设置了较早版本的 Android NDK。我们的大部分代码都是在这台机器上构建的,并创建了最终的 Android 映像。

我的开发机器使用的是最新版本的 Android NDK。

我正在开发机器上从我的 C++ 代码创建一个静态库,并将其复制到构建机器以进行最终链接。

问题是两台机器上的编译器似乎在名称修饰上有所不同。

例如,对于 std::string,我的开发机器会生成这个签名:

 std::__ndk1::basic_string<char, ...>

但是,在构建机器上,预期的签名是:

 std::__1::basic_string<char, ...>

我试图弄清楚 android-gcc 编译器是否使用不同的名称修饰方案,或者 stl 文件本身是否不同。如果是第一种情况,有没有办法强制执行不同的名称修改方案。谢谢。

【问题讨论】:

  • 您不能这样做:creating a static library from my C++ code on my development machine and copy it over to the build machine for final linking. 不保证不同工具链之间的 ABI 兼容性,因此您必须使用相同的工具链构建所有 C++ 代码。您必须确保您的开发机器工具链与构建机器匹配,或者更好的是,将您的库构建作为最终构建的一部分。
  • @MarekR,好吧,OP 解释了为什么这对他们来说是个问题。
  • 但这不是名称修改问题。
  • @MarekR 至少在某种意义上是这样 - 至少它表现为一个重整问题,尽管重整只是 ABI 的一部分。
  • @MarekR 和 OP 明确解释了为什么这对他们来说是个问题:I am creating a static library from my C++ code on my development machine and copy it over to the build machine for final linking. OP 正在做一些注定会失败的事情,但你不应该问他们“为什么这是个问题”,因为 OP 解释了为什么这种行为是一个障碍。

标签: android c++ cross-compiling


【解决方案1】:

这里没有进行名称修改。似乎有两个不同的标准库在使用,一个在名为__ndk1 的内部命名空间中定义basic_string,另一个在__1 中定义。这基本上是一个实现细节。确保使用相同的编译器和标准库实现来匹配。

附: std::basic_string 不是函数,而是类模板。

【讨论】:

    猜你喜欢
    • 2022-06-28
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多