【发布时间】:2014-08-08 21:18:25
【问题描述】:
我目前正在使用没有 std 选项的 gcc 4.8.2 来编译我的 c/c++ 代码。 现在我想使用一些新的 C/C++ 语言版本的 c/c++ 提供的新特性。
(Un?)幸运的是 gcc 理解 C/C++ 的许多风格:
- c90、c99、c11、gnu90、gnu99、gnu11
- c++98、c++03、c++11、gnu++98、gnu++03、gnu++11
目前我在问自己:
- 是否需要为每个 c/c++ 版本提供一个单独的库,或者是否可以为多个 C/C++ 版本使用一个库?
- 特别是当我使用带有 gnu 扩展的相应 c/c++ 版本时,我可以链接使用特定 c/c++ 版本编译的库吗?
说明(基于 cmets)
请注意,我只使用一个编译器。不是只有修订号不同的两个 gcc。 当只使用一个 gcc 编译器时,我只要求不同标准选项之间的 ABI 不兼容。
【问题讨论】:
-
语言本身的风格不应该改变 ABI,只是编译器本身的不同版本。您可能不想将新编译器与使用 4.6 之前的编译器编译的库结合起来,但相当现代的 gcc 版本彼此兼容(至少在 x86 上)。 [大多数 C++ 标准模板库都是在头文件中实现的——因为它是“模板”,所以应该用编译器和头文件兼容的任何语言版本都可以正常编译]
-
ABI 已经发生了很大变化。从 gcc 4.8.1 rev1 到 4.8.1 rev5,我必须重新编译整个静态库才能链接。否则它会给我未定义的符号等。从 4.7.2 到 4.8.1 更糟。如果它是动态库(.dll 或 .so),则链接在运行时完成并且工作正常。唯一担心的是 CRT 版本,很少会遇到崩溃/问题。对于静态库(.a 或 .lib 或 .o),这是一场噩梦。
-
@MatsPetersson - 对于 C ABI,这可能是一个合理的假设,但理论上
-std选项可以调用不同的链接器选项。我不会依赖次要版本之间的 C++ 运行时库兼容性。