避免Unix中的标准库冲突

时间:2018-06-25 15:15:28

标签: c++ gcc shared-libraries ld abi

我有一个共享库(so)对象,该对象公开了C API(extern "C")。它不使用API​​中的C ++,也不抛出异常。在内部,它确实使用C ++,尤其是std::map和其他容器,以及一些琐碎的模板。

我的目标是能够将该库提供给Unix中的任何程序(我为每个目标linux发行版编译了多个版本),而加载程序(例如,用{{ 1}}应该可以正常运行,即使它是用其他版本的标准库编译的也是如此。

这是我通过阅读了解的内容:

  1. 静态链接libstdc ++和libgcc
  2. 使用了链接描述文件来标记所有本地符号,但从API导出的C-ABI符号除外

    dlopen

linker_script.lds { global: my_api_func; local: *; }

我现在的问题是:如果加载程序使用标准库的不同版本(主要/次要/完全不同),是否足以让我在内部使用C ++并避免所有冲突?如果我使用C ++ 14或更高版本并遵循上述步骤怎么办?

1 个答案:

答案 0 :(得分:1)

  

我现在的问题是:如果加载程序使用标准库的不同版本(主要/次要/完全不同),是否足以让我在内部使用C ++并避免所有冲突?

就足够了。但是请确认:

  1. std::nm -C --undefined-only <my.so>中没有意外的未定义符号。
  2. 您的库不会使用nm -C --defined-only --extern-only <my.so>从C ++标准库导出任何符号。还有您不希望其导出的任何符号。
  3. readelf -d <my.so>的共享库没有意外的要求。
  

如果我使用C ++ 14或更高版本并遵循上述步骤怎么办?

只要您验证库使用和导出哪些符号,该方法就可以使用。