Шаг предварительной компиляции ESQL INFORMIX в make-файле: ошибка -33042 не удается открыть входной файл

Мне нужно изменить очень старый исходный код. Он поставляется с очень длинным Makefile, и я не очень хорошо знаком с Makefile в целом. Он также полагается на предварительную компиляцию, выполняемую старым сервером Informix.

Мне нужно изменить Makefile, чтобы исходный код внутри my_directory компилировался, включая исходные коды в common_src.

Вот структура:

- common_src
- my_directory
   - Makefile

Файлы .o должны быть созданы внутри my_directory.

Имею следующее:

COMMONSRC=$(HOME)/common_src

ESQL=   esql
ESQLFLAGS=  -e

CFLAGS= -DGTKDVPT \
    -I$(INFORMIXDIR)/incl/esql \
    -I$(COMMONSRC)

OFILES= rwfich.o
HFILES= sqlheader.h

COMMON_HFILES=  $(HFILES:%.h=$(COMMONSRC)/%.h)

gcd:        bin/gcd


bin/gcd:    $(LIBGC) gcd.o $(LIBOUTILS)
            @echo -n "Link:     bin/gcd "
            @$(CC) $(CFLAGS) gcd.o $(LIBGC) \
            $(SQLLIBS) $(LNKOPT) -obin/gcd_lnk > gcdlnk.err 2>&1
            @touch bin/gcd
            @mv -f bin/gcd bin/oldgcd
            @mv -f bin/gcd_lnk bin/gcd
            @echo "Ok."

$(LIBGC):   $(RWFOBJ) 
    @echo -n "$(LIBGC)     :    "
    @rm -f $(LIBGC)
    @echo -n "Construction ...  "
    @ar rc $(LIBGC) 
    @echo "Ok."

$(RWFOBJ):  $(OBJDIR)/%.o : $(COMMONSRC)/%.ec $(COMMON_HFILES)
            @echo -n "$<     :  Precompilation  "
            @$(ESQL) $(ESQLFLAGS) $< > $*.err 2>&1
            @echo -n "Compilation  "
            @$(CC) $(CFLAGS) -c $*.c >> $*.err 2>&1
            @rm $*.c
            @echo "Ok."

Когда я запускаю Makefile, и он достигает $(RWFOBJ), файл .err, выводимый на этапе перекомпиляции Informix для rwfich.ec, говорит: esqlc: "/home/my_directory/rwfich.ec", line 7: Error -33042: Cannot open input file 'sqlheader.h'. 1 error(s) found.

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

$(RWFOBJ):  $(OBJDIR)/%.o : $(COMMONSRC)/%.ec $(HOME)/common_src/sqlheader.h

но нет кости: я получаю ту же ошибку.

Большое спасибо всем, кто указал мне правильное направление.


person SofiaMNC    schedule 18.11.2020    source источник


Ответы (2)


При обращении за помощью всегда включайте вызванную команду make и полученную ошибку, вырезайте и вставьте в свой вопрос (с правильным форматированием), а не перефразируйте. Даже небольшие различия в точном тексте ошибки могут иметь большое значение.

Кроме того, ваш make-файл неполный, потому что вы не показываете нам значение RWOBJ, и у вас есть опечатка (вы определяете COMMON_HFILES, но вы ссылаетесь на $(COMMON_HFILE). Поскольку make не жалуется на это, я предполагаю, что опечатка существует только здесь в вашем вопросе не в вашем фактическом файле makefile (это еще одна причина, по которой вырезать и вставлять лучше).

Также укажите используемую операционную систему и версию make.

В этом случае сообщение об ошибке «Невозможно открыть входной файл» исходит не от программы make, а от вашего компилятора. Make может легко найти ваши файлы заголовков, но затем он вызывает компилятор, и вы не сказали компилятору, где найти файлы заголовков.

Вам нужно добавить параметр -I$(COMMONSRC) в строку компиляции (при условии, что вы используете компилятор в стиле POSIX, такой как GCC или clang).

Вы не предоставили достаточно информации о своем полном make-файле, чтобы мы посоветовали вам, где разместить эту опцию, но посмотрите, есть ли переменная make, содержащая другие параметры -I и т. Д.

person MadScientist    schedule 18.11.2020
comment
Спасибо за ваш ответ. Я изменил вопрос в соответствии с вашими предложениями. Вы правы, мне следовало сообщить подробности. У меня есть флаг -I $ (COMMONSRC), но ошибка возникает на этапе предварительной компиляции с сервером Informix ... - person SofiaMNC; 18.11.2020
comment
Что ж, вы должны указать серверу informix, где искать заголовки на этапе предварительной компиляции. Вероятно, вам нужно что-то добавить в переменную ESQLFLAGS. Если вы не знаете, что вам нужно добавить, и документация по прекомпилятору сервера Informix не сообщает вам об этом, то это вопрос о прекомпиляторах сервера Informix, а не о make-файлах, поэтому вам следует добавить соответствующие теги в свой вопрос. и измените резюме, чтобы попытаться привлечь людей с нужным типом знаний (например, это не ошибка Makefile) ... что, к сожалению, не я! :) - person MadScientist; 18.11.2020
comment
Понятно, да, ты прав. Спасибо, что нашли время в любом случае! - person SofiaMNC; 18.11.2020

Я решил проблему, добавив $(CFLAGS) в строку предварительной компиляции Informix, например: @$(ESQL) $(ESQLFLAGS) $(CFLAGS) $< > $*.err 2>&1, чтобы общая цель выглядела так:

$(RWFOBJ):  $(OBJDIR)/%.o : $(COMMONSRC)/%.ec $(COMMON_HFILES)
        @echo -n "$<     :  Precompilation  "
        @$(ESQL) $(ESQLFLAGS) $(CFLAGS) $< > $*.err 2>&1
        @echo -n "Compilation  "
        @$(CC) $(CFLAGS) -c $*.c >> $*.err 2>&1
        @rm $*.c
        @echo "Ok."
person SofiaMNC    schedule 18.11.2020