如何使用"Unix网络编程书"库编译C代码?

dig*_*age 5 c debian gcc makefile

介绍

我开始关注Unix网络编程2003这本书.我在这里从官方网站下载了源代码:源代码.这包括一个README文件,它告诉您如何构建/编译本书包含的所有文件.

我在这个GitHub页面(也有源代码)github上按照这些说明操作并设法使用make文件并从看起来成功配置源代码.

Makefile用于编译提供的示例

程序示例的第一章在下面突出显示的目录中.我的程序是' [BOOK] daytimetcpcli.c '并将其放在提供的Makefile中.Makefile在目标目录中:

unpv13e/$介绍

(包括所有其他书籍示例程序)

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 $@ [BOOK]daytimetcpcli.o ${LIBS}

daytimetcpcli1: daytimetcpcli1.o
    ${CC} ${CFLAGS} -o $@ daytimetcpcli1.o ${LIBS}

daytimetcpcli2: daytimetcpcli2.o
    ${CC} ${CFLAGS} -o $@ daytimetcpcli2.o ${LIBS}

daytimetcpcli3: daytimetcpcli3.o
    ${CC} ${CFLAGS} -o $@ daytimetcpcli3.o ${LIBS}

daytimetcpsrv:  daytimetcpsrv.o
    ${CC} ${CFLAGS} -o $@ daytimetcpsrv.o ${LIBS}

daytimetcpsrv1: daytimetcpsrv1.o
    ${CC} ${CFLAGS} -o $@ daytimetcpsrv1.o ${LIBS}

daytimetcpsrv2: daytimetcpsrv2.o
    ${CC} ${CFLAGS} -o $@ daytimetcpsrv2.o ${LIBS}

daytimetcpsrv3: daytimetcpsrv3.o
    ${CC} ${CFLAGS} -o $@ daytimetcpsrv3.o ${LIBS}

daytimetcpcliv6:    daytimetcpcliv6.o
    ${CC} ${CFLAGS} -o $@ daytimetcpcliv6.o ${LIBS}

daytimetcpsrvv6:    daytimetcpsrvv6.o
    ${CC} ${CFLAGS} -o $@ daytimetcpsrvv6.o ${LIBS}

byteorder:  byteorder.o
    ${CC} ${CFLAGS} -o $@ byteorder.o ${LIBS}

clean:
    rm -f ${PROGS} ${CLEANFILES}
Run Code Online (Sandbox Code Playgroud)

问题

我把我的文件放在Makefile中.但是,当我再次运行'make'时.这发生了:

make:'all'没什么可做的.

我也试过用GCC正常编译:

gcc [BOOK] daytimetcpcli.c

致命错误:unp.h:没有这样的文件或目录

所以我的问题是如何使用提供的Makefile编译我的程序?我做的正确吗?我知道我可以用GCC编译,但是我不知道包含GCC所需的头文件的语法.这就是我试图用Makefile做的原因.

在我的第二个问题之后,如何在没有makefile的情况下编译?(使用带有正确-I 标头的 gcc )?gcc program.c -I unp.h?

*注意'[BOOK] daytimetcpcli.c'= daytimetcpcli.c在官方网站上提供的源代码中.

xhi*_*nne 3

首先你在 Makefile 中的错误:

make:无需为“全部”执行任何操作。

这意味着所有 make 目标(变量的内容PROGS)都存在,并且比它们的依赖项(即必须使用什么来构建它们,IOW 源)更新。

这对您来说是出乎意料的,因为您没有将生成的二进制文件添加到PROGS变量中,而是将源文件添加到变量中。既然它存在,Make 就认为它没有什么可做的了。要纠正此问题,请更改:

PROGS = [BOOK]daytimetcpcli.c ...
Run Code Online (Sandbox Code Playgroud)

PROGS = [BOOK]daytimetcpcli ...
Run Code Online (Sandbox Code Playgroud)

[顺便说一句,在文件名中使用特殊的 shell 字符(例如和)并不是一个好主意],在 shell 命令中使用文件时不要忘记转义或引用它们。


现在你的编译命令错误:

致命错误:unp.h:没有这样的文件或目录

这意味着您还没有告诉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"
Run Code Online (Sandbox Code Playgroud)

(实际上,上面Makefile中的行仅调用链接器,CFLAGS在那里不是必需的;它仅在创建.o隐式编译的文件时使用)