在标准库中静态链接时,如何支持动态插件
How to support dynamic plugins when statically linking in standard libraries?
假设应用程序myapp.exe
是使用g++
构建的,并且它使用标志-static-libstdc++
,以便可以将其安装在没有libstdc++.so
的环境中。myapp.exe
还为某些功能plugf
添加了插件支持,这些功能可以通过shard库通过dlopen
动态加载。
如果libplug.so
是这样的插件库,也链接到libstdc++
,那么它如何以一种能够与myapp.exe
一起使用的方式?
如果libstdc++
在动态上链接,这很简单,因为myapp.exe
和libplug.so
都可以使用相同的动态加载标准库,但是我尚不清楚如何最好使用静态链接的标准库来完成此操作。
我正在考虑的一种方法是让libplug.so
也使用标志-static-libstdc++
,然后使用版本脚本
{
global: plugf;
local: *;
};
确保使用其标准库的版本,但这意味着将有两个加载到内存中的libstdc++
的副本。我知道这种方法不会受到C 标准的祝福,因为它会违反Ord违规,但是libstdc++
可以以任何方式支持吗?手册部分的Multiple ABI testing
部分确实引用了听起来相似的场景。
是的,此解决方案可以起作用,但
- 由于代码重复,它引入了某些开销
- ,由于您最近的libstdc 在插件/应用程序之间尝试传递插件/应用程序之间的stl对象,它可能会破裂。
删除由std::allocator
在不同C 运行时分配的对象应该在Linux上工作,尽管我在LibstDC 文档中找不到有关此的明确说明。当Mikhail在评论中指出时,它确实在Windows上失败。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 哪个C++规范开始支持 std::vector
- 如何检测VS C++编译器是否支持C++11?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 将 IPv6 支持添加到雨量计
- 为什么C++不支持对未初始化变量进行智能分析?
- LMDB 是否支持随机读取?
- 在 c++ 中连接字符串和整数,以便在 C++ 11 不支持计算机的情况下读取多个文件
- 在 Ubuntu 18.04 上编译 GLSL 着色器时"不支持 GLSL 3.30"?
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错