2

「make」に問題があります (ああ、恐ろしい!)。

一部の COBOL コードを Windows から Linux に移行しようとしています。コンパイラなどは Micro Focus のものです。Windows では、コードは Micro Focus Net Express で開発されています。Linux には、同等の Micro Focus Server Express があります。プログラムは、「make」スクリプトを使用してコンパイルおよびリンクされます。

背景はこれで終わりです。

問題は、Linux で実行可能ファイルをコンパイルおよびリンクしたくない「make」スクリプトです。ターゲットは次のようになります。

# 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」というターゲットを解決しようとしています。

以下を含む 2 番目の「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があり、スクリプト内の他の同様の構造が正しく機能することを確信しています。

簡単な「make」でリンクエラーが発生します:

> 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」でも上記と同じエラーが発生します。変!しかし、私が本当に理解できないのは、ターゲットが存在しない場合に「make datLoad.o」から得られる応答です。

make: Nothing to be done for `datLoad.o'.

そのファイルがまだ存在しない場合、ターゲット「datLoad.o」が必要なターゲットファイルを作成しようとするだろうと思いました(天が助けてくれます)。私は怒っていますか?

これが少しあいまいに思われる場合は申し訳ありませんが、より適切に表現する方法がわかりません。誰かが何が起こっているのか考えているなら、私は本当に感謝しています...

4

1 に答える 1

0

ありがとうマッドサイエンティスト。あなたのヒントは正しかった。

含まれている .mk には .SUFFIXES ルールが含まれていました。問題は、$O が一貫して使用されていなかったことです。$O は、もともと Windows 用の ".obj" に設定されていました。Linux では ".o" です。ただし、.SUFFIXES ルールには「.obj」がハードコードされているため、もちろん「.o」ターゲットは認識されませんでした。ハードコーディングされたサフィックスを $O 変数に置き換えたところ、機能するようになりました。

アヒム

于 2013-10-25T12:11:52.260 に答える