0

次のメイクファイルがあります。

CC = gcc

ROOTPATH = /home/swagatam
LIB_PATH = $(ROOTPATH)/mylib/libf2c.a \
            $(ROOTPATH)/mylib/blas_LINUX.a \
        $(ROOTPATH)/mylib/lapack_LINUX.a -lm


INC_PATH = -I$(ROOTPATH)/myinclude

swadgesv : swadgesv.o
    $(CC) $(LIB_PATH) swadgesv.o -o swadgesv

swadgesv.o : swadgesv.c
    $(CC) $(INC_PATH) -c swadgesv.c

clean:
    rm -f *.o

swadgesv.c は、AX = B の形式の方程式を解くプログラムです。この問題を解くには、リンクする 3 つのヘッダー ファイルと 3 つのライブラリが必要です。しかし、ターミナルで Makefile を実行すると、次のように表示されます。

gcc -I/home/swagatam/myinclude -c swadgesv.c
gcc /home/swagatam/mylib/libf2c.a /home/swagatam/mylib/blas_LINUX.a         /home/swagatam/mylib/lapack_LINUX.a -lm swadgesv.o -o swadgesv
swadgesv.o: In function `main':
swadgesv.c:(.text+0x0): multiple definition of `main'
/home/swagatam/mylib/libf2c.a(main.o):(.text.startup+0x0): first defined  here
/home/swagatam/mylib/libf2c.a(main.o): In function `main':
(.text.startup+0xad): undefined reference to `MAIN__'
swadgesv.o: In function `main':
swadgesv.c:(.text+0xc1): undefined reference to `dgesv_'
collect2: ld returned 1 exit status
make: *** [swadgesv] Error 1

また、LIB_PATH でライブラリの順序を変更しても、さまざまなエラーが表示されます。インストールした clpack ライブラリから関数 dgsev を呼び出しています。

4

1 に答える 1

6

オブジェクト ファイルの後にライブラリを配置します。

swadgesv: swadgesv.o
    $(CC) swadgesv.o -o swadgesv $(LIB_PATH)

最初にライブラリをリストすると、ローダーはシンボルを探しmain()ますが、通常はライブラリ内で見つからないため、ライブラリからシンボルをリンクする理由がなく、効果的にそれらを無視します。最終的にオブジェクトファイルに出くわすと、 が見つかりますが、オブジェクトファイルの後の (存在しない) 引数でmain()参照されるシンボルは見つかりません。main()したがって、シンボルは未定義のままです。リンク行の引数の順序は重要です。

于 2013-01-19T22:47:41.537 に答える