2017-06-08 4 views
1

私はmakefileの新機能です。私は最後の-lcjsonとそのは完璧に動作してコマンドcsonsonコードのメイクファイルをjsonパーサーの-lcjsonで作成してください。

gcc -test1.c -o test -lcjson 

を使用して、端末からcJsonライブラリが含まれているCコードファイルをコンパイルしています。しかし、makefileを使って同じコードをコンパイルするには、最後に-lcjsonを追加する必要があります。 私は-lcjson私が取得していますエラー

/tmp/cc4ESrx1.o: In function `parse_json': 
test1.c:(.text+0x2d): undefined reference to `cJSON_Parse' 
test1.c:(.text+0x42): undefined reference to `cJSON_GetObjectItem' 
test1.c:(.text+0x59): undefined reference to `cJSON_GetObjectItem' 
collect2: error: ld returned 1 exit status 

ことがあるので、私は事前に

おかげで

+1

私はあなたの質問がなぜ定義されていないと思うのですか?libを指定する順序を見直したいかもしれません。また-test1.cは-c test1.cでなければなりません。 – Pras

+0

@Pras:いいえ、 '-c'はオブジェクトファイルを取得します。単一のソースファイルを実行可能ファイルにコンパイルするときは、*使用しないでください*。 –

+0

@Aditya:あなたは '-lcjson'ライブラリのCコードをコンパイルしていません。あなたは*リンク*してそのライブラリを使用しています。 –

答えて

0

まず、あなたの実行可能testを付けないようにRTOSのコードを使用していなくて使用している場合標準のプログラム名(POSIXでは少なくとも)。

次に、documentation of GNU makeを読んでください。チュートリアルのセクションが含まれています。最後に

、GNU makeをあなたはたとえば this answerを参照してください make -p

を得ることができますいくつかの組み込みのルールを持っています。

すべての警告とデバッグ情報(つまり、GCCを使用している場合はgcc -Wall -Wextra -g)を使用してコンパイルすることを強くお勧めします。あなたのMakefileCFLAGS+= -Wall -Wextra -gCC=gccを入れてください。

-lcjsonとリンクするには、MakefileLIBES+= -lcjsonを追加してください。 のタブの文字はMakefileで重要であることを覚えておいてください(たとえば、emacsなどの一部のエディターを使用して編集できます)。

ので、試してみてください。

# your Makefile, replace four spaces with tab 
CC= gcc 
CFLAGS+= -Wall -Wextra -g 
RM= rm -f 
MY_SOURCES=$(wildcard *.c) 
## above could be an MY_SOURCES= file1.c file2.c otherfile.c 
MY_OBJECTS=$(patsubst %.c,%.o,$(MY_SOURCES)) 
# 
LIBES= -lcjson 
# 
.PHONY: all clean 
## 
all: myprog 
## 
clean: 
    $(RM) myprog *.o *~ 
myprog: $(MY_OBJECTS) 

使用make --traceまたはremake-xもしあなたがすべき同じプログラムに一緒にリンク*.c haver 複数のソースファイル(つまり、translation unitsある)、場合あなたのMakefile

をデバッグします共通のヘッダーファイルmyheader.h(すべてのパブリック関数と変数の共通の宣言を共有する)があります。これは#includeです。すべてのソースファイルにあります。そして、あなたはそれに依存する必要があります。program arguments to gccの順序が重要な非常にである(とまたは任意のMakefileなし)という

MY_HEADER= myheader.h 
%.o: %.c $(MY_HEADER) 

注意してください。 thisを参照してください。

関連する問題