0

codeblocks IDE で開発されたいくつかのコードを移植中です。コマンドラインのみを使用してコードをコンパイルできるLinuxサーバーに転送しています。コードは非常に大きく (おそらく 100 ファイル)、多くのファイルでインクルード コマンドを更新する必要があります。たとえば、エラーをコンパイルしようとする#include <gsl/gsl_math.h>と、ファイルが見つからないというエラーが発生します。IDE の検索ディレクトリ フィールド オプションの 1 つで gsl フォルダの場所が宣言されているため、見つからないことが想定されます。各ファイルを更新して正しいパスに更新することもできますが、これをメイクファイルで使用するためのより良い方法はありますか?

ありがとう!

問題の Makefile を編集

# -c : do not link, just create object file
# -o : output file name

CFLAGS += -c -O2 -I../ctraj -I../cspice/include -I../SGP4 -I../cconj -I../GSL-1.13/include 
LIBS = -L../ctraj -lctraj -L../cspice/lib -lcspice -L../SGP4 -lsgp4 -L../cconj -lcconj -L./ -lgsl-0 -lgslcblas-0 -lm
DEPS = light.h ../ctraj/ctraj.h ../cconj/cconj.h
OBJ = light.o tle.o propagator.o orbitfit.o conjunction.o light_displacement.o forces_LF.o
OUT = light.exe

%.o: %.c $(DEPS)
gcc -o $@ $< $(CFLAGS)

light: $(OBJ)
cd ../ctraj/; make
gcc -o $(OUT) $(OBJ) $(LIBS)

clean:
rm *.o $(OUT)

編集 2

フォルダ構造

ライト->(GSL-1.13、ライト、cconj、ctraj)

Makefile は Light フォルダー内にあります。

エラーメッセージ

cd ../ctraj/; make
make[1]: Entering directory `/light/ctraj'
gcc -o forces.o forces.c -c -Wall -Wno-maybe-uninitialized -Wno-unused-but-set-variable -O2 -I../cspice/include -Inrlmsise
In file included from ../Light/../cconj/cconj.h:12:0,
             from ../Light/light.h:13,
             from forces.c:3:
../Light/../cconj/../GSL-1.13/include/gsl/gsl_blas.h:26:28: fatal error: gsl/gsl_vector.h: No such file or directory
compilation terminated.
make[1]: *** [forces.o] Error 1
make[1]: Leaving directory /light/ctraj'
make: *** [light] Error 2

編集3

cconj の 2 番目の makefile

# -c : do not link, just create object file
# -o : output file name
#-L../cconj -lcconj 

CFLAGS += -c -O2 -I./ -I../GSL-1.13/include 
LIBS = -L./ -lgsl-0 -lgslcblas-0 -lm
INC= -I../GSL-1.13/include
DEPS = cconj.h 
OBJ = cconj_util.o ellipse_intersect.o collision_prob_real.o rcs2size.o
OUT = libcconj.a

%.o: %.c $(DEPS)
gcc -o $@ $< $(CFLAGS)

cconj: $(OBJ)
ar rcs $(OUT) $(OBJ) 

clean:
rm *.o $(OUT)
4

2 に答える 2

2

次の行をメイクファイルに追加してみて、動作するかどうか教えてください。

CFLAGS += -I../GSL-1.13/include

ソース コードをコンパイルしてオブジェクト ファイルを生成するために、Make は規則を使用する必要があります。(そのようなルールを makefile に入れなければ、Make にはその目的のためのデフォルトのルールがあります。) 次のようになります。

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

それがどのように機能するかを深く掘り下げなくても、これCFLAGSはコンパイラに渡される引数のリストであると言えます。を追加するとき-I../GSL-1.13/include、コンパイラに「何かを #include したいのにどこにも見つからない場合は、../GSL-1.13/include を調べてください」と伝えます。

この方法がうまくいかない場合は、メイクファイルに見つけて変更しなければならないルールがある可能性があります。

編集:

問題はこのメイクファイルにはありません (既に への参照が含まれていますGSL-1.13/include)。このコマンドでは:

cd ../ctraj/; make

この makefile は、 の Makefile を使用する 2 番目の Make プロセスを起動しlight/cconj/ます。コンパイラ出力 ( gcc -o forces.o ...) によると、その makefile には参照が含まれていませ。そこに同じ行を追加してみてください。それが機能しない場合は、そのメイクファイルを投稿してください。探し続けます。

于 2013-09-09T21:24:14.433 に答える