2017-09-19 8 views
4

はじめ"Unix networking programming book"ライブラリでCコードをコンパイルするには?

私は本UNIXネットワークプログラミング2003次始めました。私はここに公式サイトからソースコードをダウンロードしました:source code。これには、READMEファイルが含まれています。これは、本のために含まれているすべてのファイルをビルド/コンパイルする方法を示しています。

このGitHubページ(ソースコードもあります)の指示に従いますgithubそして、makeファイルを使用してソースが正常に表示されるように管理しました。例をコンパイルする

Makefileは例がディレクトリにあるプログラムの最初の章では、以下強調表示

を提供しました。 私のプログラムは '[BOOK] daytimetcpcli.c'であり、提供されているMakefileの中に配置されています。ターゲットディレクトリ内のMakefile:

unpv13e/intro$

(他のすべての書籍のサンプルプログラムが含まれます)

include ../Make.defines 

PROGS = [BOOK]daytimetcpcli.c daytimetcpcli1 daytimetcpcli2 daytimetcpcli3 \ 
    daytimetcpsrv daytimetcpsrv1 daytimetcpsrv2 daytimetcpsrv3 \ 
    daytimetcpcliv6 daytimetcpsrvv6 \ 
    byteorder 

all: ${PROGS} 




[BOOK]daytimetcpcli: [BOOK]daytimetcpcli.o 
    ${CC} ${CFLAGS} -o [email protected] [BOOK]daytimetcpcli.o ${LIBS} 

daytimetcpcli1: daytimetcpcli1.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcli1.o ${LIBS} 

daytimetcpcli2: daytimetcpcli2.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcli2.o ${LIBS} 

daytimetcpcli3: daytimetcpcli3.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcli3.o ${LIBS} 

daytimetcpsrv: daytimetcpsrv.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv.o ${LIBS} 

daytimetcpsrv1: daytimetcpsrv1.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv1.o ${LIBS} 

daytimetcpsrv2: daytimetcpsrv2.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv2.o ${LIBS} 

daytimetcpsrv3: daytimetcpsrv3.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrv3.o ${LIBS} 

daytimetcpcliv6: daytimetcpcliv6.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpcliv6.o ${LIBS} 

daytimetcpsrvv6: daytimetcpsrvv6.o 
    ${CC} ${CFLAGS} -o [email protected] daytimetcpsrvv6.o ${LIBS} 

byteorder: byteorder.o 
    ${CC} ${CFLAGS} -o [email protected] byteorder.o ${LIBS} 

clean: 
    rm -f ${PROGS} ${CLEANFILES} 

問題

私はMakefileの内側に私のファイルを置きました。しかし、私は再び 'make'を実行します。これが発生します。

gcc [BOOK]daytimetcpcli.c

fatal error: unp.h: No such file or directory

だから私の質問はどのように私は提供されるMakefileと私のプログラムをコンパイルするんです:

make: Nothing to be done for 'all'.

を私はまた、GCCと普通のコンパイルしようとしましたか?私は正しいことをしていますか?そして私はGCCでコンパイルできることを知っていますが、GCCで必要なヘッダーファイルを含める構文はわかりません。だから私はMakefileでそれをやろうとしたのです。

私の2番目の質問に続き、makefileなしでどのようにコンパイルすればよいですか? (正しい-I ヘッダのgccを使用して)? gcc program.c -I unp.h?

※公式サイトのソースコードの '[BOOK] daytimetcpcli.c' = daytimetcpcli.cに注意してください。

+1

直接コンパイルすると、明らかにヘッダーファイルがありません。ファイルMake.definesはCFLAGSを見つけることができるようにCFLAGSを設定しています。私は '[BOOK]'文字に驚いています。大括弧はシェルにとって特別です。アンダースコアを使用するか、完全に削除してみてください。 –

+0

@icarusは注意して修正しました。私はこれを知らなかった。 – digitalXmage

答えて

3

まずMakefileのあなたの間違いは:

make: Nothing to be done for 'all'.

これは、すべてが(PROGS変数の内容)の目標を作る存在し、すなわち、それらを構築するために何を使用する必要があります(その依存関係よりも新しいことを意味しIOWソース)。

変数PROGSにバイナリを追加していないため、ソースファイルではありません。それが存在するので、Makeはこれ以上何もしないと考えます。これを修正するには、変更:

PROGS = [BOOK]daytimetcpcli.c ... 

PROGS = [BOOK]daytimetcpcli ... 

には、ところで、それはあなたのファイル名に[]などの特殊シェル文字を使用するように素晴らしいアイデアではありません、エスケープまたは引用することを忘れないでくださいそれらはシェルコマンドでファイルを使用するときに使用します。コンパイルコマンドで


は、今すぐあなたの間違い:

fatal error: unp.h: No such file or directory

それはあなたがどこヘッダファイルを見つけるためにgccに語っていないことを意味します。なぜそれがmakeで動作するのですか? Makefileのコマンドには、追加のオプション:${CFLAGS}${LIBS}が含まれているため、Make.definesincludeの行を参照)で定義されている2つの変数があります。

あなたは正しいコンパイルコマンドは次のようになります。

gcc -o "[BOOK]daytimetcpcli" -I../lib -g -O2 -D_REENTRANT -Wall ../libunp.a -lpthread "[BOOK]daytimetcpcli.c" 

(実際には、上記のみMakefileの行はリンカを呼び出し、CFLAGSが必要ありません。そのまとめたものです.oファイルを作成するときにのみ使用されています暗黙的)

関連する問題