避免 unix 中的标准库冲突
Avoiding standard library conflicts in unix
我有一个共享库(so(对象,它公开了一个C API(extern "C"
(。它不会在 API 中使用C++,也不会引发异常。在内部,它确实使用C++,尤其是std::map
和其他容器,以及一些琐碎的模板。
我的目标是能够将此库提供给 unix 中的任何程序(我为每个目标 linux 发行版编译多个版本(,而不会在加载程序上出现标准库符号问题(即加载我的库的程序dlopen
即使它使用另一个版本的标准库编译,也应该正常运行(。
以下是我通过阅读所做的:
- 静态链接libstdc++和libgcc
-
使用链接器脚本将所有符号标记为本地,但从 API 导出的 C-ABI 符号除外
linker_script.lds { global: my_api_func; local: *; }
g++ shared.cpp -Wl,--version-script=vs.lds -fPIC -static-libstdc++ -static-libgcc -shared -o libshared.so
我在这一点上的问题:如果加载程序使用标准库的不同(主要/次要/完全不同的(版本,这是否足以让我在内部使用 C++ 并避免所有冲突?如果我使用 C++14 或更新的内容并遵循上述程序怎么办?
我在这一点上的问题:如果加载程序使用标准库的不同(主要/次要/完全不同的(版本,这是否足以让我在内部使用 C++ 并避免所有冲突?
这应该足够了。但请验证:
- 没有意外的未定义符号来自
std::
与nm -C --undefined-only <my.so>
. - 您的库不会从带有
nm -C --defined-only --extern-only <my.so>
的C++标准库中导出任何符号。以及您不希望它导出的任何符号。 - 没有意外需要的共享库与
readelf -d <my.so>
.
如果我使用 C++14 或更新的内容并遵循上述程序怎么办?
只要验证库使用和导出的符号,此方法就应该有效。
相关文章:
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 写入位置0x0000000C时发生访问冲突
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- C++第三方库 typedef 与标准 stdin.h 冲突
- 避免 unix 中的标准库冲突
- 使用 C++ 标准库避免共享库中的符号冲突
- 标准库标识符与用户标识符冲突
- 如何处理标头名称与标准库标头冲突,但不更改文件名?
- c ++标准与cmake的冲突
- C++冲突声明的标准定义
- 如何在不与标准库运算符冲突的情况下为一组相关类重载运算符?
- 名称冲突与标准库