(这个问题有点晦涩,没有太多动机,所以请耐心等待。)
为了便于讨论,我们假设我有两个文件,a.cpp
和 b.hpp
.假设 a.cpp
有声明
template <typename T> void foo(T& t);
在代码的某处它有命令:
foo<int>(1234);
foo<double>(12.34);
同时 b.hpp
包含实际的(模板化的)定义,仅此而已。
现在,a.cpp
, 编译时不包括 b.hpp
将编译成目标文件,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
获取签名。然后我需要在不实际引起任何其他副作用的情况下强制它们的实例化......也许定义一个变量,其类型是指向 foo<T>
的指针。对于 T
的每个值我找到了。
无论如何,这一切看起来都很笨拙,我想知道是否有一些与构建相关的工具可以为您做这件事。或者我是否应该完全采用另一种方法。
最佳答案
我不认为您可以开箱即用。您可能会尝试使用 LibClang 等工具编写自己的“所需实例化提取器” .
另请注意,获得可在其他翻译单元中使用的实例化的唯一合法方法是请求显式实例化:
template void foo(int& t);
关于c++ - 如何根据目标文件中缺少的符号来实例化模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28352092/