如何根据对象文件中缺少的符号实例化模板

How to go about instantiating templates based on symbols missing in an object file?

本文关键字:符号 实例化 何根 对象 文件      更新时间:2023-10-16

(这个问题有点晦涩,没有太多动机,所以请耐心等待。)

为了便于讨论,我们假设我有两个文件,a.cppb.hpp。假设a.cpp具有声明

template <typename T> void foo(T& t);

在代码的某个地方,它有命令:

foo<int>(1234);
foo<double>(12.34);

而CCD_ 4保持实际的(模板化的)定义。

现在,在不包括b.hpp的情况下编译的a.cpp将编译成一个目标文件a.o,该文件期望与包含foo<int>foo<double>的目标代码的其他文件链接。b.hpp本身不进行foo()的实例化,因此单独编译它是没有用的。

然而,如果我要确定哪些实例化是必要的,并生成包含最小代码的a.aux.cpp来实例化a.cpp所需的模板,我就不必手动确保进行实例化。

那么,我该如何实现这一目标呢?我在考虑做

nm --undefined-only a.cpp | sed 's/^ *//;' | c++filt | grep foo

以获取签名。然后我需要在不造成任何其他副作用的情况下强制实例化它们。。。也许为我找到的CCD_ 15的每个值定义一个变量,其类型是指向CCD_。

不管怎样,这一切看起来都很笨拙,我想知道是否有一些与构建相关的工具可以为你做到这一点。或者我是否应该另辟蹊径。

我认为没有任何东西可以开箱即用。您可以尝试使用LibClang等工具编写自己的"所需实例化提取器"。

还要注意,获得在其他翻译单元中可用的实例化的唯一合法方法是请求显式实例化:

template void foo(int& t);