2017-09-19 31 views
4

介紹如何用「Unix網絡編程書籍」庫編譯C代碼?

我已經開始這本書UNIX網絡編程2003以下。我已經從官方網站下載了源代碼:source code。這包括一個README文件,它告訴你如何構建/編譯本書包含的所有文件。

我在這個GitHub頁面(它也有源代碼)上按照這些說明github並設法使用make文件並從看起來成功配置源代碼。

生成文件編譯實施例中提供

程序的例子是,在目錄的第一章下面突出顯示。 我的程序是'[書] 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'時。出現這種情況:

make: Nothing to be done for 'all'.

我也嘗試了正常的編譯與海灣合作委員會:

gcc [BOOK]daytimetcpcli.c

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

所以我的問題是我怎麼編譯我的Makefile中程序提供的?我所做的是正確的?我知道我可以使用GCC進行編譯,但是我不知道包含GCC需要的頭文件的語法。這就是爲什麼我試圖用Makefile來做到這一點。

下面是我的第二個問題,如何在沒有makefile的情況下編譯? (使用gcc的正確-I 標題)? gcc program.c -I unp.h?

*注「[圖書] daytimetcpcli.c」中所提供的官方網站的源代碼= daytimetcpcli.c,在源。

+1

當您直接編譯時,您顯然缺少頭文件。 Make.defines文件正在設置CFLAGS,因此它可以找到它。我對'[BOOK]'字符感到驚訝,方括號對於shell來說是特殊的。嘗試使用下劃線或完全刪除它們。 –

+0

@icarus注意到並更正了謝謝,我不知道這一點。 – digitalXmage

回答

3

首先你的錯誤在Makefile:

make: Nothing to be done for 'all'.

這意味着所有使目標(在PROGS變量的內容)存在,而且比它們的依賴關係更近(即什麼是必須用於構建它們, IOW來源)。

這是意想不到的你,因爲你沒有生成的二進制文件添加到PROGS變量,但源文件。既然存在,Make認爲它沒有更多的事情要做。爲了解決這個問題,更改:

PROGS = [BOOK]daytimetcpcli.c ... 

PROGS = [BOOK]daytimetcpcli ... 

順便說一句,這不是用特殊的shell字符,如[並在文件名],不要忘了逃跑或引用一個偉大的想法他們在shell命令中使用該文件時。現在


您在編譯命令錯誤:

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

這意味着你還沒有告訴gcc在哪裏可以找到的頭文件。爲什麼它會與make一起工作?因爲Makefile中的命令包含附加選項:${CFLAGS}${LIBS},這兩個變量在Make.defines(參見include行)中定義。

您正確的編譯命令應該是:

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

(實際上,在Makefile中的線上面只調用鏈接器和CFLAGS是沒有必要存在;它創造了.o文件,文件的編譯時才使用隱式)