如何根据对象文件中缺少的符号实例化模板
How to go about instantiating templates based on symbols missing in an object file?
(这个问题有点晦涩,没有太多动机,所以请耐心等待。)
为了便于讨论,我们假设我有两个文件,a.cpp
和b.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);
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- 使用大括号和 : 符号的对象实例化
- clang:使用 O3 导出隐式实例化函数的符号
- 如何根据对象文件中缺少的符号实例化模板