- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有一个接受或返回某种标准类的共享库:
//lib.h
#include <vector>
std::vector<int> returnSomeInts();
//lib.cpp
#include "lib.cpp"
std::vector<int> returnSomeInts() {
return {1, 3, 5};
}
很明显,在编译共享库 lib.so
时,必须针对标准库的特定版本编译此代码,例如 -std=c++11。
现在假设我们有一个应用程序将使用我们的共享库,但它将针对较新的标准库进行编译,例如 -std=c++2a
//app.cpp
#include <lib.h>
int main()
auto v = returnSomeInts();
//Process v
}
由于标准库定义了内联类,如果类成员的布局发生变化,ABI 兼容性就会被破坏,因此上面的代码将无法正常工作。
我的问题是:当使用不同的 C++ 标准针对相同的 header 进行编译时,std 库的通用实现是否可以保证 ABI 的稳定性?当针对不同的头文件版本(例如 libstdc++-8 和 libstdc++-9)进行编译时?
PD:上面的代码只是一个例子,我并不是特指std::vector
最佳答案
实践中的 ABI 没有链接到标准,例如考虑以下代码 compiled使用 gcc 4.9.4 和 gcc 5.1使用相同的标志:
-std=c++11 -O2
#include <string>
int main(){
return sizeof (std::string);
}
gcc 4.9.4 从 main 返回 8,gcc 5.1 返回 32。
至于保证:它很复杂:
标准不保证任何内容。
实际上 MSVC 曾经破坏 ABI 兼容性,他们停止了(v140、v141、v142 使用相同的 ABI),clang/gcc 有很长一段时间稳定的 ABI。
对于那些有兴趣了解更多信息的人:有关与此问题没有直接关系的 ABI/C++ 标准的广泛讨论,请查看此 blog邮政。
关于linux - 标准库 ABI 兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60836246/
我是 Linux 系统编程新手,在阅读时遇到了 API 和 ABILinux系统编程。 API定义: An API defines the interfaces by whichone piece o
ABI 标准中与内存布局相关的规范是否通常仅适用于 ABI 边界,或者也适用于例如在翻译单元中,或者如果不是这种情况,编译器通常会做出这样的额外保证吗? 如果“一般”太宽泛,请考虑例如带有 Syste
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
当我尝试使用调试配置在 QtCreator 中运行我的项目时,出现以下错误: 我什至不知道 ABI 是什么。我应该检查哪些设置?可能出了什么问题? 这是我的“桌面”配置: 当我将其悬停时,QtCrea
什么是 ABI,为什么 C++ 没有标准的 ABI,如果有它为什么重要? 最佳答案 ABI 是一个 Application Binary Interface .它描述了如何组织和访问应用程序二进制文件
Fatal Error: Mismatch between the program and library build versions detected. The library used 3.0
我上次在 Android Studio 中将 NDK 版本升级到最新版本后遇到了这个问题。我还找到了解决此问题的解决方案。如果有人有这个问题,我希望这是对你最好的问题和答案。请检查我的答案。 最佳答案
是否可以在没有源代码的情况下获取已知合约地址的ABI? 我发现的唯一方法是使用 etherscan 的 API,但它仅适用于经过验证的合约。 最佳答案 简单的回答:不 长答案:也许吧。 ABI 是从源
不解决 C++ 某些问题的常见解释是它会破坏 ABI 并需要重新编译,但另一方面,我遇到了这样的语句: Honestly, this is true for pretty much all C++ n
我想知道 C 头文件和 ABI 之间的关系。各种类型的大小是体系结构甚至依赖于编译器的。那么如何才能可靠地链接到 C 库呢? 对于一个更具体的问题:当使用 Haskell 的 FFI 时,甚至只使用像
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
问题: 在使用 Android Studio 时,我无法在 HTC One M7 或任何模拟器上安装我的应用程序。在升级到 5.0.2(从 4.4?)之前,它运行良好。我收到的错误消息是 INSTAL
前言:这个问题已经过时了。 在创建 Android 虚拟设备 (AVD) 时,可以选择 CPU/ABI。我已经尝试了所有可用的目标——除了 ARM 别无选择。我的目标是 Android 3.2。 我假
标题说明了一切。我将向具有默认值的类的成员函数添加一个参数。该参数属于非平凡类型。这会破坏 ABI 吗?假设我的新库版本将是 M.m.0,它应该可以作为所有使用 M.m-1.x 的链接应用程序的直接替
我有一个配置探测器,它根据平台和版本确定要传递给 g++ 的标志。我通常使用比 native 安装版本更高版本的 gcc,以便访问 C++14 功能。在较旧的平台上,这意味着我需要添加 -D_GLIB
我看到很多关于 C++ 没有标准 ABI 的讨论,就像 C 一样。我很好奇究竟是什么问题。到目前为止,我想出了 名称修改 异常处理 RTTI 还有其他与 C++ 相关的 ABI 问题吗? 最佳答案 在
我正在使用 ethers-rs 编写一个 defi 应用程序。我需要计算 Rust 中的 CREATE2 地址。我在 Rust 中找不到与 abi.encodePacked(token0, token
尝试使用此 setup.py 从空项目创建轮子: 设置.py from setuptools import setup setup(name='bla', version='1') 我调用 pytho
使用 Android Gradle Experimental 插件版本 0.9.1。我需要为每个 ABI 设置不同的静态库搜索路径,有什么方法可以实现吗? 这里是 build.gradle fragm
假设我们有一个接受或返回某种标准类的共享库: //lib.h #include std::vector returnSomeInts(); //lib.cpp #include "lib.cpp"
我是一名优秀的程序员,十分优秀!