2

MBP で共有ライブラリをコンパイルしたいのですが、こちらのアドバイスに基づいて、共有ライブラリを作成するためにclang(から) に切り替えましたgcc。私makefileは:

CC = clang
CFLAGS = -c -fPIC -Wall -O3 -lpthread -g
BaseDir = /Users/admin/Prog/
Include = -I$(BaseDir)UMFPACK/Include -I$(BaseDir)AMD/Include -I$(BaseDir)SuiteSparse_config
Lib = -L$(BaseDir)UMFPACK/Lib -L$(BaseDir)AMD/Lib -L$(BaseDir)GotoBLAS2 -L$(BaseDir)SuiteSparse_config
AddFiles = -lumfpack -lamd -lgoto2 -lsuitesparseconfig
StaticLibs = $(BaseDir)GotoBLAS2/libgoto2.a $(BaseDir)UMFPACK/Lib/libumfpack.a $(BaseDir)AMD/Lib/libamd.a $(BaseDir)SuiteSparse_config/libsuitesparseconfig.a

all: TDS.o TDSJac.o ExtraRoutines.o CalcVFC.o TDS.h
        $(CC) $(Include) $(Lib) $(AddFiles) -dynamiclib -lpthread -o libTDS.so $^ -lm -g $(StaticLibs)

TDS.o: TDS.c TDS.h
        $(CC) $(Include) $(CFLAGS) $^

TDSJac.o: TDSJac.c TDS.h
        $(CC) $(CFLAGS) $^

ExtraRoutines.o: ExtraRoutines.c TDS.h
        $(CC) $(CFLAGS) $^

CalcVFC.o: CalcVFC.c TDS.h
        $(CC) $(CFLAGS) $^

MexFile: TDSGateway.c
        mex -g -largeArrayDims -ldl TDSGateway.c

Move:
        mv libTDS.so ../../
        mv TDSGateway.mexmaci64 ../../

ここで行うことは次のとおりです。 1) 、、、、のみをコンパイルしてTDS.c、対応する 4 つのオブジェクト ファイルを作成します。2) オブジェクト ファイルをマージし、次のコマンドを使用して共有ライブラリを作成します。TDSJac.cExtraRoutines.cCalcVFC.c

clang -I(Some folders) -L(Some folders) -l(Some libraries) -shared -lpthread -o libTDS.so TDS.o TDSJac.o ExtraRoutines.o CalcVFC.o TDS.h -lm -g
clang: error: cannot specify -o when generating multiple output files

私はclangにまったく慣れていないので、Makefileの何が問題なのかわかりません。( に置き換えるCC=clangCC=gcc、すべて正常に動作します。) インターネットで検索しましたが、うまくいきませんでした。clang のマニュアル ページには、共有ライブラリについては何も書かれていません。clangホームページからは何も取得できませんでした。この問題を回避するのを手伝っていただければ幸いです。

事前にご協力いただきありがとうございます。

4

2 に答える 2

1

私は昨日ほぼ同じ問題を抱えていました。しかし、私はcmakeを使用したことがありません。私は自分の会社の独自のメイクファイル システムを使用しているので、これまでのところ何が問題を解決したかをお伝えできます。

Clang は、エラーケースに関する適切なヒントを提供するのにまだ問題があります。リンクエラーは次のとおりです。

/usr/bin/ld: /usr/lib/crt1.o: relocation R_X86_64_32 against `_DYNAMIC' can not be used when making a shared object; recompile with -fPIC

-shared パラメーターは -o Xo パラメーターの背後にある必要があることを理解したので、問題を解決しました。私が見るように、これもあなたの場合には行われていません。最初にそれを試してみてください。

私たちの場合、LFlags を -WL または -L で解析する必要もありました (どちらを使用しても問題ありませんが、-Wl に関連する Clang バグについて読みました)。ただし、cmakeを使用する場合、LFlagsを解析する必要があるかどうかはわかりません。

于 2013-08-06T07:52:40.323 に答える
1

TDS.hヘッダー ( ) を依存関係としてリストしましたが、これは問題ありませんが、すべての依存関係$^を含む入力として使用しています。ヘッダーを入力としてリストしないでください。これはコマンドライン上にあるべきではありません。これは実際にはエラーです。clang

エラー メッセージはわかりにくいですが、簡単に解決できます。次の 2 つの選択肢があります。

  1. を使用する代わりに明示的にし$^ます。入力に変数を使用し、依存関係に別の変数を使用できます。また
  2. への入力として.o、ファイルの代わりに中間ファイルを使用します。ファイルは、含まれているものに依存できます。.c.so*.o.h
于 2015-05-28T03:02:12.947 に答える