我有一个共享库(so)对象,该对象公开了C API(extern "C"
)。它不使用API中的C ++,也不抛出异常。在内部,它确实使用C ++,尤其是std::map
和其他容器,以及一些琐碎的模板。
我的目标是能够将该库提供给Unix中的任何程序(我为每个目标linux发行版编译了多个版本),而加载程序(例如,用{{ 1}}应该可以正常运行,即使它是用其他版本的标准库编译的也是如此。
这是我通过阅读了解的内容:
使用了链接描述文件来标记所有本地符号,但从API导出的C-ABI符号除外
dlopen
linker_script.lds
{
global: my_api_func;
local: *;
}
我现在的问题是:如果加载程序使用标准库的不同版本(主要/次要/完全不同),是否足以让我在内部使用C ++并避免所有冲突?如果我使用C ++ 14或更高版本并遵循上述步骤怎么办?
答案 0 :(得分:1)
我现在的问题是:如果加载程序使用标准库的不同版本(主要/次要/完全不同),是否足以让我在内部使用C ++并避免所有冲突?
就足够了。但是请确认:
std::
和nm -C --undefined-only <my.so>
中没有意外的未定义符号。nm -C --defined-only --extern-only <my.so>
从C ++标准库导出任何符号。还有您不希望其导出的任何符号。readelf -d <my.so>
的共享库没有意外的要求。如果我使用C ++ 14或更高版本并遵循上述步骤怎么办?
只要您验证库使用和导出哪些符号,该方法就可以使用。