我正在创建仅模板的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>
的地址不调用函数;它只是强制运行时链接程序一次(在启动时)找到该符号。但是,您可能会违反链接器垃圾回收。