Mic*_*rny 8 c++ templates shared-libraries
我正在创建一个仅模板的C++库.但是,我还想提供一个"空"共享库,这样通过控制SONAME,只要模板发生变化,导致实例化模板ABI不兼容,我就能够强制重建模板使用者.
遗憾的是,如果特定用户-Wl,--as-needed
在其中LDFLAGS
,链接器将删除我的共享库,NEEDED
因为已编译的可执行文件不从它请求任何符号.如何确保程序始终链接到我的库,最好不要引入不必要的虚函数调用(或者如果我必须这样做,使它们负担最小)?
编辑:作为注释,特定模板类提供静态方法,通常只使用那些静态方法.因此,依赖构造函数中的任何内容并不是一个好主意,而且我真的希望避免通过某种强制执行来加重所有方法的负担.
受到@EmployedRussian的启发,我实现了:
extern int dummy;
namespace
{
struct G
{
inline G()
{
dummy = 0;
}
};
static const G g;
}
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,对包括头文件在内的每个单元执行一次赋值.
但是,我也想提供一个“空”共享库,以便通过控制 SONAME,每当模板发生变化导致实例化模板 ABI 不兼容时,我就能够强制重建模板使用者。
这将在运行时强制发生错误。
您可以在不使用 的情况下轻松实现相同的结果(运行时错误)SONAME
。在您的模板标头之一中,放入一个全局对象,该对象将在 runime 中
libmysolib_version_<N>
,或dlopen(libmysolib.so, ...)
和dlsym("libmysolib_version_<N>", ...)
N
然后每次打破 ABI 时就继续递增。
最好不要引入不必要的虚拟函数调用
获取地址libmysolib_version_<N>
并不调用函数;它只是强制运行时链接器找到该符号一次(在启动时)。不过,您可能会遇到链接器垃圾收集的问题。