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

Kaz*_*ade 11 c++ gcc c++11

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

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

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

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

pe3*_*e3k 5

正如已经在几个地方(例如这里)提到的那样,libc++ 与 libstdc++ 并不完全二进制兼容。有多种选择,但其中一些不太直接。

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

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