2017-09-19 28 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文件,文件的编译时才使用隐式)