Как я могу предотвратить цитирование include из поиска в каталоге текущего исходного файла? - программирование
Подтвердить что ты не робот

Как я могу предотвратить цитирование include из поиска в каталоге текущего исходного файла?

gcc предоставляет параметр -I-, для которого поиск каталогов -I, предшествующих -I-, для цитируемых включает (#include "foo.h"), а -I каталоги, следующие за -I-, ищут для заключенных в скобки включений (#include <foo.h>), а также после включения других цитируемых ссылок.

-I- имеет еще один очень важный эффект. Он удаляет каталог исходного файла, в котором находится #include, из пути поиска по умолчанию. Обычно цитируемый include всегда ищет каталог исходного файла и ищет его перед любыми -I или другими каталогами. Таким образом, -I- позволяет точно указать, куда обратиться за цитированными файлами include в том порядке, в котором вы хотите, удалив этот путь по умолчанию, который в противном случае будет иметь приоритет.

Так звучит, что я ответил на мой вопрос, да? Нет. Когда я использую -I- сейчас, я получаю эту nastygram:

cc1: note: obsolete option -I- used, please use -iquote instead

Проблема заключается в том, что -iquote не удаляет текущий каталог из пути поиска. Он по-прежнему всегда просматривается первым, независимо от того, что я предоставляю -iquote.

Итак, возникает вопрос: как получить тот же эффект, что и -I-, не используя -I-, который устарел и в конечном итоге уйдет?

Разработка:

Предположим, что файлы выложены следующим образом:

srcdir/
    configure
    file1.c
    file2.c
    config.h

builddir/
    Makefile
    file1.o
    file2.o
    config.h
    libpudding.a

По разным причинам мы не можем удалить config.h из srcdir (это повлияет на процесс сборки на других платформах). Однако мы хотим включить config.h из builddir в предпочтение zconf.h в srcdir.

Это может быть выполнено с помощью значка GCC -I-, но, похоже, это невозможно.

Обновленный вопрос:

Хорошо, похоже, что разработчики GNU CC устарели -I-, но не предоставили альтернативный способ достижения своей функциональности. Итак, мой обновленный вопрос: какой самый эффективный способ привлечь внимание разработчиков, так что существует высокая вероятность того, что либо -I- недосчитан (что я считаю наиболее предпочтительным, так как это довольно элегантный способ обрабатывать задание поиска, гораздо более и менее менее уродливое, чем -iquotexxx), или что какой-то способ предоставляется для удаления текущего каталога из цитируемого пути поиска поиска?

4b9b3361

Ответ 1

Работая с неприятностями zconf.h в сборке вне дерева, я определенно вернусь к вашей точке, что, когда вопрос супер-хитрый, это часто неправильный вопрос. Вы абсолютно правы. Правильный вопрос: почему zconf.h существует в srcdir вообще, когда он должен быть сгенерирован из zconf.h.in. Файл должен либо генерироваться, либо никогда не генерироваться для заданного набора параметров конфигурации. Он никогда не должен предоставляться и генерироваться в одной и той же сборке.

Лучшее решение здесь - удалить zconf.h из исходного дерева и всегда генерировать его из zconf.h.in так же, как и в сборке CMake. Мне никогда не было ясно, почему это сделано для CMake и для Make. Если дело в том, что у вас нет autoconf, и поэтому вы собираетесь использовать предварительно построенный zconf.h для make, но сгенерированный CMake для CMake, тогда просто отправьте его как zconf.h.in (который вы do) и скопируйте его в дерево сборки в файле Makefile.

Избавление от причудливого поведения -I- было хорошим шагом. Наличие нескольких файлов в вашем пути поиска, которые называются с тем же именем, чрезвычайно запутанным и уродливым. Если порядок поиска -I имеет значение, тогда что-то не правильно спроектировано в вашем проекте или в вашей сборке. Мне не нужно было догадываться, что означает #include "foo.h". Я определенно никогда не буду в ситуации, когда легко найти редактирование неправильного файла.

Я приветствую вашу работу по улучшению сборки zlib. zlib, конечно, не самый сложный пакет для сборки, но он, конечно же, не самый простой (особенно если вам нужны материалы contrib/minizip, которые я неизменно делаю).