如何在 make 依赖文件中包含 IBM XLC 模板 *.c 文件?
对于 XLC 编译器,模板化代码位于 *.c 文件中。 然后,当编译使用模板函数的程序时,编译器会在 .c 文件中找到模板定义并实例化它们。
问题是,在执行 xlC -qmakedepend 生成构建依赖项时,默认情况下不包含这些 .c 文件。 因此,如果您更改这些 .c 文件之一,您将不会自动构建依赖于它的所有内容。
有没有人找到解决这个问题的好方法?
For the XLC compiler, templated code goes in a *.c file. Then when your program is compiled that uses the template functions, the compiler finds the template definisions in the .c file and instantiates them.
The problem is that these .c files are not by default included when doing an xlC -qmakedepend to generate the build dependencies. So if you change one of those .c files, you won't automatically build everything that depends on it.
Has anyone found a good solution to this problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
简而言之,答案是使用 XLC 的 tempinc 实用程序进行迁移。
tempinc 实用程序要求您使用头文件(.h 或 .hpp)中的模板声明和 .c 文件中的实现来设置文件(此扩展名是强制性的)。 当编译器找到模板实例化时,它会将显式实例化放入 tempinc 目录中的另一个源文件中,强制为它们生成代码。 编译器知道在 foo.c 中查找 foo.h 中 declered 的模板定义。
我指定的问题是依赖项构建器不知道这一点,因此无法将您的 .c 文件包含在依赖项中。
对于版本 6.0 IBM 建议使用 -qtemplateregistry设置而不是-qtempinc。 然后,您可以使用典型的模板设置,将模板定义包含在头文件中,然后依赖项查找器可以看到该模板定义,或者将它们放在一个单独的文件中,您可以从头文件中#include该文件,并且也可以将它们放在一个单独的文件中。使用依赖查找器找到。
如果您要从使用 -qtempinc 进行迁移,则可以使用如下代码有条件地从声明文件中 #include 模板实现文件:
因此,如果您决定返回使用 -qtempic 设置,您的代码将构建并链接。
In short, the answer is to migrate off using the XLC's tempinc utility.
The tempinc utility requires you to set up your files with the template declarations in your header (.h or .hpp) file and your implementations in a .c file (this extension is mandatory). As the compiler finds template instantiations, it will put explicit instantiations in a another source file in your tempinc directory, forcing code to be generated for them. The compiler knows to find the template definitions declered in foo.h in foo.c.
The problem I specified is that the dependency builders don't know about this, and thus can't include your .c files in the dependencies.
With Version 6.0 IBM recommends using a the -qtemplateregistry setting rather than -qtempinc. Then, you can use a typical template set up of including the template definitions in your header file, which will then be visible to the dependency finder, or putting them in a separate file which you #include from your header file, and will also be found using the dependency finder.
If you are migrating from using -qtempinc, you can conditionally #include your template implementation file from your declaration file with code like below:
Thus your code will build and link if you ever decide to go back to using the -qtempic setting.