繁体   English   中英

如何使C ++(共享)库与clang和GCC兼容?

[英]How do I make a C++ (shared) library compatible with clang and GCC?

我写了一个相当庞大的C ++ 11库,我打算允许从我的网站下载预编译版本。

所以我已经建立了一个自动构建,用clang编译库并使其可供下载,但这暴露了一个问题:如果我尝试使用GCC的clang编译库我得到未定义的引用(主要与std::string相关) std::string )。 我认为这与GCC 5.1中的GCC双ABI变化有关,但我不确定如何解决它。

我的问题是,我应该设置什么标志,或者我应该遵循哪些做法使C ++库与clang和GCC兼容?

或者我应该放弃并编译两个独立的库?

正如在几个地方已经提到的那样(例如, 这里 ),libc ++与libstdc ++不是完全二进制兼容的。 有几个选项,但其中一些选项有点不那么直截了当。

  1. 编译两个独立的库 - 始终工作解决方案。
  2. 从您的界面中删除不兼容的容器(例如std :: string) - 但这可能是很多工作,有时候不是一个好主意。
  3. 向您的库GCC用户指示您使用libc ++进行链接,并且他们需要在此处执行相同的基本步骤。 但我想大多数GCC用户不想这样做。
  4. 使用带有libstdc ++的clang,使用-stdlib=libstdc++ flag与libstdc ++兼容(如其他答案所示)。 但是,在某些平台上设置此解决方案可能更难。

我建议如评论中已经提到的那样选择选项1。

有几种选择:

  1. 不要以二进制形式分发它。 相反,在任何地方都可以轻松构建(例如使用CMake或autotools或......)

  2. 仅限标题。 这是迄今为止最简单的解决方案,但可能不是您想要的。 它只对模板化代码有意义,并且会对库的编译时性能产生严重影响。

  3. 使用Clang和您的库时,告诉人们链接libstdc ++。 次优解决方案(我喜欢检查我的代码与libc ++以及libstdc ++),但(实际上)每个Linux用户都安装了libstdc ++。 确保选择稍微旧的版本(最新的Debian Stable发行版中提供的版本是一个不错的选择),因为较新的版本可能会引入新的符号缺少版本。 无论如何,新版本应该是ABI兼容的。

请注意,Visual Studio用户的情况甚至更糟,每个编译器发布都需要一个新的二进制文件,因为它们对C ++库或编译器的ABI完全没有任何保证。

另一个选择是您的共享库不在其接口中公开任何C ++标准库类型。 并且您的共享库提供了一个头文件,它将std::string转换为库所使用的类型,例如struct my_string_span { char const *begin, *end; }; struct my_string_span { char const *begin, *end; }; 和其他标准容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM