【发布时间】: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