使用-Wl实现与共享库的链接, - 根据需要(仅提供模板时)

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)

但遗憾的是,对包括头文件在内的每个单元执行一次赋值.

Emp*_*ian 4

但是,我也想提供一个“空”共享库,以便通过控制 SONAME,每当模板发生变化导致实例化模板 ABI 不兼容时,我就能够强制重建模板使用者。

这将在运行时强制发生错误。

您可以在不使用 的情况下轻松实现相同的结果(运行时错误)SONAME。在您的模板标头之一中,放入一个全局对象,该对象将在 runime 中

  1. 获取地址或电话libmysolib_version_<N>,或
  2. dlopen(libmysolib.so, ...)dlsym("libmysolib_version_<N>", ...)

N然后每次打破 ABI 时就继续递增。

最好不要引入不必要的虚拟函数调用

获取地址libmysolib_version_<N>并不调用函数;它只是强制运行时链接器找到该符号一次(在启动时)。不过,您可能会遇到链接器垃圾收集的问题。