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

标签 c++ c++11 gcc

我已经编写了相当丰富的 C++11 库,并且我计划允许从我的网站下载预编译版本。

所以我设置了一个自动构建,它使用 clang 编译库并使其可供下载,但这暴露了一个问题:如果我尝试将 clang 编译的库与 GCC 一起使用,我会得到 undefined reference (主要是与 std::string 相关)。我认为这与 GCC 5.1 中的 GCC 双 ABI 更改有关,但我不确定如何修复它。

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

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

最佳答案

正如在几个地方(例如 here)提到的,libc++ 与 libstdc++ 不是完全二进制兼容的。 有多种选择,但其中一些并不是那么简单。

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

如评论中所述,我建议选择选项 1。

关于c++ - 如何使 C++(共享)库与 clang 和 GCC 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48072848/

相关文章:

c++ - g++ 编译器中的 “Uninitialized use” 警告

c++ - 为什么 C++ 不允许在声明函数之前使用它们?

gcc - 使用 g++ 编译 GSL odeiv2

c++ - 为什么 static 修饰符会阻止其变量被重新分配新值?

c++ - 正确删除指针双端队列

c++ - 在多个文件中使用全局变量

c++ - 如何将 const weak_ptr 放入 STL 容器中

c++ - 实现像 ios_base::Init 这样的初始化器的标准方法

c++ - 较新版本的 GCC 抛出 reinterpret_cast 错误

c++ - 为 iPhone 构建时出现 GCC 链接器错误