1

初めてのメイクファイルを作成しようとしています。次のコマンドを使用してプログラムをテストしました。

Command 1: gcc -Wall -ggdb3 -std=c99 -o file1 file1.c -lm -lpthread -l
Command 2: gcc -Wall -ggdb3 -std=c99 -o file2 file2.c -lm -lpthread

すべてがうまく機能します。次に、makefile を作成しました (以下を参照してください)。エラーメッセージが表示され続けます。誰かが私のコードを見て、何が問題なのかヒントを教えてもらえますか?

file2.o: In function `seed_primes':
file2.c:(.text+0x461): undefined reference to `sqrt'
file2.c:(.text+0x466): undefined reference to `sqrt'
file2:(.text+0x533): undefined reference to `sqrt'
file2.o: In function `create_threads':
file2.c:(.text+0x668): undefined reference to `pthread_create'
file2.c:(.text+0x6b5): undefined reference to `pthread_join'
file2.o: In function `next_seed':
file2.c:(.text+0x860): undefined reference to `sqrt'
collect2: ld returned 1 exit status
make: *** [file2] Error 1

これが私のメイクファイルです:

CC=gcc
DEBUG=-ggdb3
CFLAGS=#(DEBUG) -Wall -lm -lpthread -lrt -l

PROGS=file1 file2 

all: $(PROGS) 

file1: file1.o
    $(CC) $(CFLAGS) -o file1 file1.o 

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

file2: file2.o
    $(CC) $(CFLAGS) -o file2 file2.o 

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

clean:
    rm -f $(PROGS) *.o *~
4

2 に答える 2

7

コメント文字のために CFLAGS を空の文字列に設定しました#(おそらく代わりに a を使用するつもりでした$)。

ライブラリを に設定しないでくださいCFLAGS。彼らはに属していLDLIBSます。

file1:ルール、file2:ルール、またはオブジェクト ファイル ルールは必要ありません。

CC     = gcc
DEBUG  = -ggdb3
CFLAGS = $(DEBUG) -Wall
LDLIBS = -lm -lpthread -lrt -l

PROGS  = file1 file2 

all: $(PROGS) 

clean:
    rm -f $(PROGS) *.o *~

注意:LDLIBSおよび関連するは、 のLDFLAGSバリアント間で 100% 均一ではありませんmakeLDFLAGSライブラリ パスに使用する必要があります。LDLIBSライブラリ名(-lxyzなど)用です。

2 つのプログラムに異なるライブラリが必要な場合は、(元のように) 別のビルド ルールを作成するか、条件付きマクロの割り当て (GNU make) を使用する必要があります。

于 2013-08-23T16:48:41.367 に答える
1

コマンドラインでオブジェクトファイルの前にCFLAGSフラグを表示するすべてのフラグを配置します。テストコマンドがそれをしなかったことに注意してください。

フラグを変更します。

CFLAGS=$(DEBUG) -Wall 
LDFLAGS=-lm -lpthread -lrt

そして、レシピで:

$(CC) $(CFLAGS) -o file1 file1.o $(LDFLAGS)
于 2013-08-23T16:48:07.093 に答える