对于 XLC 编译器,模板化代码位于 *.c 文件中。然后,当编译使用模板函数的程序时,编译器会在 .c 文件中找到模板定义并实例化它们。
问题是在执行 xlC -qmakedepend 生成构建依赖项时,默认情况下不包含这些 .c 文件。因此,如果您更改其中一个 .c 文件,您将不会自动构建依赖它的所有内容。
有没有人找到解决这个问题的好方法?
简而言之,答案是使用 XLC 的 tempinc 实用程序进行迁移。
tempinc 实用程序要求您使用头文件(.h 或 .hpp)中的模板声明和 .c 文件中的实现来设置文件(此扩展名是强制性的)。当编译器找到模板实例化时,它将显式实例化放在您的 tempinc 目录中的另一个源文件中,强制为它们生成代码。编译器知道在 foo.c 中找到在 foo.h 中声明的模板定义。
我指定的问题是依赖项构建器不知道这一点,因此无法将您的 .c 文件包含在依赖项中。
对于版本 6.0 ,IBM 建议使用 -qtemplateregistry 设置而不是 -qtempinc。然后,您可以使用一个典型的模板设置,将模板定义包含在您的头文件中,然后依赖项查找器可以看到该模板定义,或者将它们放在您从头文件中#include 的单独文件中,并且也将是使用依赖查找器找到。
如果您从使用 -qtempinc 进行迁移,则可以有条件地从声明文件中 #include 模板实现文件,代码如下:
// end of foo.h
#ifndef __TEMPINC__
#include "foo.c"
#endif
因此,如果您决定重新使用 -qtempic 设置,您的代码将构建和链接。