Как включить файлы шаблона * .c IBM XLC в файл зависимости?
Вопрос
Для компилятора XLC шаблонный код помещается в файл * .c. Затем, когда ваша программа скомпилирована с использованием функций шаблона, компилятор находит определения шаблона в файле .c и создает их.
Проблема в том, что эти файлы .c по умолчанию не включены при выполнении xlC -qmakedepend для генерации зависимостей сборки. Поэтому, если вы измените один из этих файлов .c, вы не будете автоматически создавать все, что от него зависит.
Кто-нибудь нашел хорошее решение этой проблемы?
Решение
Короче говоря, ответ состоит в том, чтобы выполнить миграцию с помощью утилиты tempinc в XLC.
Утилита tempinc требует, чтобы вы настраивали свои файлы с объявлениями шаблонов в вашем файле заголовка (.h или .hpp) и вашими реализациями в файле .c (это расширение является обязательным). Когда компилятор находит экземпляры шаблона, он помещает явные экземпляры в другой исходный файл в вашем каталоге tempinc, заставляя генерировать для них код. Компилятор знает, как найти определения шаблонов, объявленные в foo.h в foo.c.
Проблема, которую я указал, заключается в том, что разработчики зависимостей не знают об этом и, следовательно, не могут включать ваши файлы .c в зависимости.
В версии 6.0 IBM рекомендует использовать параметр -qtemplateregistry , а не -qtempinc. Затем вы можете использовать типичный набор шаблонов, включающий определения шаблонов в заголовочный файл, который затем будет виден для искателя зависимостей, или помещать их в отдельный файл, который вы #include из заголовочного файла, а также будет найдено с помощью средства поиска зависимостей.
Если вы переходите с использования -qtempinc, вы можете условно #include ваш файл реализации шаблона из файла декларации с кодом, как показано ниже:
// end of foo.h
#ifndef __TEMPINC__
#include "foo.c"
#endif
Таким образом, ваш код будет собираться и связываться, если вы когда-нибудь решите вернуться к использованию параметра -qtempic.