如果类未完全实现,是否可以强制共享C++库无法生成?
Can I force a shared C++ library to fail to build if a class isn't fully implemented?
我有C++插件:
class PluginBase
{
public:
virtual void foo () = 0;
virtual void bar () = 0;
};
extern "C" PluginBase * new_instance ();
这是作为共享库实现的
class PluginImplementation : public PluginBase
{
void foo () override;
void bar () override;
}
void PluginImplementation::foo () {}
// void PluginImplementation::bar () {} // NOTE: MISSING
extern "C" PluginBase * new_instance ()
{
return new PluginImplementation ();
}
这是使用 gcc
CMake
构建的:
ADD_LIBRARY (plugin_implementation SHARED PluginImplementation.cpp)
即使未实现PluginImplementation::bar
,也会生成libplugin_implementation.so
。
我知道缺少的符号可能在运行时在程序的其他地方定义,因此链接器允许它在动态库中丢失。
我不想这样。
有没有办法使.so
无法构建,除非定义了所有类成员?
如果您的目标是现代 ELF,并且您不希望通过其名称或其他符号直接引用此类,则可以将可见性设置为隐藏:
class __attribute__ ((visibility ("hidden")))
PluginImplementation : public PluginBase
然后,链接器将尝试解析在本地(在共享对象内(实现虚拟方法的函数的符号,这将导致硬链接器错误(为便于阅读而包装(:
plugin.o:(.data.rel.ro.local._ZTV20PluginImplementation
[_ZTV20PluginImplementation]+0x18):
undefined reference to `PluginImplementation::bar()'
/usr/bin/ld: plugin.so: hidden symbol `_ZN20PluginImplementation3barEv'
isn't defined
即使省略了控制 vtable 发射的成员函数(以便共享对象不包含 vtable 及其函数指针(,new_instance
函数也会调用一个构造函数,该构造函数必须存储 vtable 指针,并且在隐藏可见性的情况下,这将产生未定义的符号错误, 太。
我认为您必须创建一个测试或其他一些代码段,该代码具有main
,链接到共享库,并尝试实例化有问题的类。无论如何,这似乎是一个好主意,因为您应该进行单元测试。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 为什么我的共享库中存在展开符号
- 使用共享指针的函数调用,其对象应为 const
- 具有两个独占锁组的共享锁
- 共享队列的线程安全
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 多个"常量引用"变量可以共享同一个内存吗?
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针