1

だから私はこの問題を抱えています:私は私のCプログラムでいくつかのexternグローバル変数を宣言しています。gcc に -c オプションを使用しないと、未定義の参照エラーが発生します。しかし、その -c オプションでは、リンクは行われません。つまり、実行可能ファイルが生成されていません。

では、どうすればこれを解決できますか?

これが私のmakefileです(Alexに感謝して書かれました)

CC = gcc                      # compiler/linker frontend
INCL = -I$(INCL_DIR)          # includes
DEFS = -D_DEBUG_              # defines
CFLAGS = -g $(INCL) $(DEFS)   # compiler flags
LFLAGS = -lpthread -lm -g     # linker flags

OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe
LINKOBJ  = approx.o producteur.o sequentialApproximation.o main.o
RM = rm -fv

all: $(BIN)

clean:
 ${RM} *\~ \#*\# $(OBJ)

clean_all: clean
 ${RM} $(BIN)

cleanall: clean
 ${RM} $(BIN)

$(BIN): $(OBJ)
 $(CC) $(LFLAGS) -o $@ $^

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

.c.o:
 $(CC) $(CFLAGS) -c $<

そして、これが make の出力です: http://pastebin.com/NzsFetrn

私は approx.h (extern および global) で extern 変数を宣言しましたが、approx.c でそれらを呼び出そうとしましたが、そこでは機能しません。

4

1 に答える 1

3

解決策 1

-cコンパイラにリンクをスキップするように指示するため、リンクフェーズを渡すことはできません。

あなたの問題は

$(BIN): $(OBJ)
    $(CXX) $(LINKOBJ) -o "calculPi.exe"

CXX_FLAGS =-g -c -lpthread -lm

$(CXX)展開する場所gcc -g -c -lpthread -lm ...

そこを取り除く-c

ソース モジュールからオブジェクト モジュールにコンパイルする場合は、-c のみを渡します。

解決策 2

2 番目の問題に関しては、実際にはどこにも変数を定義していません。ファイルには、.c次の行が必要です。

Coord* production;
int indice_prod;
int indice_cons;

(本当にグローバル変数が必要だと仮定します)。これにより、未解決の外部エラーが修正されます。それらが割り当てられるまで、それらに書き込むことはできません!

ノート

また、ソースからオブジェクト ファイルをビルドする方法を 1 つのルールで指定できることにも注意してください。

.c.o:
    $(CC) $(CFLAGS) -c $<

ルールなしで依存関係を指定します。

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

その他の注意事項。

また、一般的な経験則として、CXXフラグは含めずにコンパイラ名のみを含める必要があります。それらは入るはずCXX_FLAGSです。そして、なぜあなたはそれを呼んでいCXXないのCCですか?g++C++ コンパイラが必要な場合に使用するか、 CC. ファイルがあるので.c、C と仮定します。したがって、あなたの場合は次のように変更する必要があります。

CXX_FLAGS =-g -c -lpthread -lm
CXX = gcc $(CXX_FLAGS) $(INCL) $(DEFS)

CC = gcc
CFLAGS = -g -lpthread -lm $(INCL) $(DEFS)  # also removed -c

また、別のLINK_CXX.

サンプル Makefile

したがって、最小限の Makefile は次のようになります。

# Makefile
CC = gcc                      # compiler/linker frontend
INCL = -I$(INCL_DIR)          # includes
DEFS = -D_DEBUG_              # defines
CFLAGS = -g $(INCL) $(DEFS)   # compiler flags
LFLAGS = -lpthread -lm -g     # linker flags

OBJ = approx.o producteur.o sequentialApproximation.o main.o
BIN = calculPi.exe

all: $(BIN)

$(BIN): $(OBJ)
    $(CC) $(LFLAGS) -o$@ $^

main.o: main.c
approx.o: approx.c approx.h
producteur.o: producteur.c producteur.h
sequentialApproximation.o : sequentialApproximation.c sequentialApproximation.h

.c.o:
    $(CC) $(CFLAGS) -c $<

# clean and other stuff.
于 2010-05-08T10:10:05.353 に答える