我正在创建仅模板的C++库。但是,我也想提供一个“空”共享库,以便通过控制SONAME,只要模板发生更改,就可以实例化模板ABI不兼容,从而能够强制重建模板使用者。

可悲的是,如果特定用户的-Wl,--as-needed中有LDFLAGS,则链接器将从NEEDED中删除我的共享库,因为编译后的可执行文件不会向它请求任何符号。如何确保程序始终与我的库链接,最好不要引入不必要的伪函数调用(或者,如果必须这样做,使它们负担最少)?

编辑:请注意,特定的模板类提供了静态方法,通常仅使用那些静态方法。因此,依赖于构造函数中的任何内容都不是一个好主意,我真的想避免以某种形式的执行来负担所有方法的负担。

受@EmployedRussian的启发,我实现了:

extern int dummy;

namespace
{
    struct G
    {
        inline G()
        {
            dummy = 0;
        }
    };

    static const G g;
}

但是可悲的是,这会对包括头文件在内的每个单元执行一次分配。

最佳答案



这将在运行时强制错误。

您无需使用SONAME即可轻松达到相同的结果(运行时错误)。在您的模板 header 之一中,放入一个将在运行时

  • 接收地址或致电libmysolib_version_<N>
  • 执行dlopen(libmysolib.so, ...)dlsym("libmysolib_version_<N>", ...)

  • 然后,只要您每次破坏ABI时都保持N递增即可。



    libmysolib_version_<N>的地址不调用函数;它只是强制运行时链接程序一次(在启动时)找到该符号。但是,您可能会违反链接器垃圾回收。

    07-24 18:27
    查看更多