gpt4 book ai didi

debian - 如何使用 "Unix networking programming book"库编译 C 代码?

转载 作者:太空狗 更新时间:2023-10-29 15:05:18 25 4
gpt4 key购买 nike

简介

我已经开始阅读 Unix Network programming 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 $@ [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}

问题

我将我的文件放在 Makefile 中。但是,当我再次运行“make”时。发生这种情况:

make: Nothing to be done for 'all'.

我也尝试过使用 GCC 进行正常编译:

gcc [BOOK]daytimetcpcli.c

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

所以我的问题是如何使用提供的 Makefile 编译我的程序?我做的对吗?而且我知道我可以使用 GCC 进行编译,但是我不知道包含 GCC 所需的头文件的语法。这就是为什么我试图用 Makefile 来做。

接下来是我的第二个问题,我如何在没有 makefile 的情况下进行编译? (将 gcc 与正确的 -I headers 一起使用)? gcc program.c -I unp.h ?

*官网提供的源码中注意'[BOOK]daytimetcpcli.c' = daytimetcpcli.c,在源码中。

最佳答案

首先是你在 Makefile 中的错误:

make: Nothing to be done for 'all'.

这意味着所有 make 目标(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 文件时使用)

关于debian - 如何使用 "Unix networking programming book"库编译 C 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46313143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com