У меня проблема с "сделать" (о ужас!).
Мы пытаемся перенести некоторый код COBOL из Windows в Linux. Компилятор и тому подобное от Micro Focus. Под Windows код разработан с помощью Micro Focus Net Express. Linux имеет Micro Focus Server Express в качестве эквивалента. Программы компилируются и компонуются с помощью скриптов make.
Так много для фона.
Проблема заключается в том, что скрипт make не хочет компилировать и связывать исполняемый файл под Linux. Цели выглядят так:
# HP INIT-Daten laden
#
datLoad$O: \
$(UI)/defretrn.cpy \
$(UI)/e12sy00s.cpy \
$(UI)/e12sy005.cpy \
$(UI)/e12sy006.cpy \
$(UI)/e12sy010.cpy \
$(UI)/e12sy013.cpy \
$(UI)/e12sy050.cpy \
$(UI)/e12db001.cpy \
$(UI)/e12db050.cpy \
$(UI)/evlg.cpy \
$(UI)/deffehl.cpy \
datLoad.xcbl $(FRC)
# @echo "dollar-O is \"$O\" in $@"
datLoad$X: $(LIBDSQL) datLoad$O \
$(LP)/evlg$O $(LP)/alock$O
$(LCOB) -o $(@:$X=) -e $(@:$X=) $(LCOBFLAGS) \
-d e12db001 -d e12db003 -d e12db012 \
-d e12sy005 -d e12sy006 -d e12sy009 \
-d e12sy010 -d e12sy012 -d e12sy013 \
-d e12sy050 \
-I EvLgSetCategory $(LP)/evlg$O \
-I ALckSetDebug $(LP)/alock$O \
$(LIBEXEEXT) "$(LIBXSQL)"
if [ -f $B/$@ -a ! -w $B/$@ ] ; then rm -f $B/$@ ; fi
cp $@ $B
Чтобы поместить это в контекст, $0=".o" (т.е. расширение объектного файла). $(LCOB) — это команда ссылки. $X=".exe" (исполняемый файл... просто забудьте о расширении, со временем мы это исправим). Все остальные вещи относятся к путям ==> не имеют отношения к рассматриваемой проблеме, и да, все они были проверены и проверены.
В конечном счете, я пытаюсь заставить «make» разрешить цель с именем «datLoad.o».
Включен второй скрипт make, содержащий следующее:
COBFLAGS = -cx # create object file
GNTFLAGS = -ug # create .gnt file
SOFLAGS = -z # create
LCOB = cob
...
.cbl$O:
$(CCOB) $(COBFLAGS) $*.cbl, $*$O, NUL, NUL
if [ -f $(LP)/$*$O -a ! -w $(LP)/$*$O ] ; then rm -f $(LP)/$*$O ; fi
cp $*$O $(LP)
Соответствующая часть - это цель, которая разрешается в ".cbl.o:". Да, это сокращенная версия, и она мне не очень нравится, но я не писал этот скрипт. Я уверен, что это действительно означает, что *.o:*.cbl
и другие подобные конструкции в сценарии работают правильно.
С простым «сделать» я получаю ошибку ссылки:
> In function `cbi_entry_point': (.data+0x384): undefined reference to
> `datLoad' /tmp/cobwZipkt/%cob0.o: In function `main': (.text+0x28):
> undefined reference to `datLoad' make: *** [datLoad.exe] Error 1
Это означает, что datLoad.o не был создан. Если я создам его явно с помощью:
cob -cx datload
Затем «сделать» по-прежнему дает ту же ошибку, что и выше. Странный! Однако чего я действительно не могу понять, так это ответа, который я получаю от «make datLoad.o», когда цель не существует:
make: Nothing to be done for `datLoad.o'.
Я предположил (небеса, помоги мне), что цель «datLoad.o» попытается создать требуемый целевой файл, если этот файл еще не существует. Я схожу с ума?
Извините, если это кажется немного неясным, я не уверен, как сформулировать это лучше. Если у кого-нибудь есть идеи, что может происходить, я был бы очень благодарен...
.SUFFIXES: .cbl .o
, чтобы гарантировать, что.cbl
является известным суффиксом. Я предлагаю вам запуститьmake -p
и изучить вывод, чтобы убедиться, что правила, которые вы ожидаете, присутствуют, что переменная$O
установлена достаточно рано, чтобы иметь правильное значение, и т. д. Также вы можете запуститьmake -d
и изучить вывод, чтобы понять, какие шаги make принимает, чтобы определить, устарела ли цель или нет. - person MadScientist   schedule 25.10.2013