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