【发布时间】:2012-08-11 19:28:05
【问题描述】:
我正在创建一个仅模板的 C++ 库。但是,我还想提供一个“空”共享库,以便通过控制 SONAME,只要模板发生变化导致实例化模板 ABI 不兼容,我就可以强制重建模板消费者。
遗憾的是,如果特定用户的LDFLAGS 中有-Wl,--as-needed,则链接器将从NEEDED 中删除我的共享库,因为编译的可执行文件不向其中请求任何符号。如何确保程序始终与我的库链接,最好不要引入不必要的虚拟函数调用(或者如果我必须这样做,使它们的负担最小化)?
编辑:需要注意的是,特定的模板类提供了静态方法,通常只使用那些静态方法。因此,依赖于构造函数中的任何内容都不是一个好主意,我真的很想避免通过某种强制执行来加重所有方法的负担。
受 @EmployedRussian 的启发,我实现了:
extern int dummy;
namespace
{
struct G
{
inline G()
{
dummy = 0;
}
};
static const G g;
}
但遗憾的是,它为每个单元(包括头文件)执行一次分配。
【问题讨论】:
-
不能
-ulinker option 帮忙吗?不需要从源进行虚拟调用。在-u之后传递的符号将被视为未定义,并将链接所需的库 -
刚刚试过了,好像不行。我想我应该添加
-Wl,-u,some_symbol_in_the_library,对吗? -
嗯,我认为这只是
-u some_symbol_in_the_library没有-Wl选项。让我检查一次 -
很抱歉,但由于某种原因,我无法让它与示例程序一起使用!尽管即使在手册页中也提到了
-u symbol应该强制链接,但我清楚地记得至少在我使用过它的一种情况下。希望有人能指出正确的方向 -
好吧,也许描述是在添加
--as-needed之前。
标签: c++ templates shared-libraries