Debian 如何用;Unix网络编程书;图书馆?

Debian 如何用;Unix网络编程书;图书馆?,debian,makefile,gcc,c,Debian,Makefile,Gcc,C,导言 我已经开始学习Unix网络编程2003这本书。我已经从这里的官方网站下载了源代码:。这包括一个自述文件,它告诉您如何构建/编译本书包含的所有文件 我在这个GitHub页面上遵循了这些说明(其中也有源代码),并设法使用make文件并成功地从表面上配置了源代码 Makefile编译提供的示例 程序示例的第一章在下面突出显示的目录中。 我的程序是“[BOOK]daytimetcpli.c”,并将其放在提供的Makefile中。目标目录中的Makefile: unpv13e/简介$ (包括所有其他

导言

我已经开始学习Unix网络编程2003这本书。我已经从这里的官方网站下载了源代码:。这包括一个自述文件,它告诉您如何构建/编译本书包含的所有文件

我在这个GitHub页面上遵循了这些说明(其中也有源代码),并设法使用make文件并成功地从表面上配置了源代码

Makefile编译提供的示例

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

unpv13e/简介$

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

问题

我将文件放在Makefile中。然而,当我再次运行“make”时。出现这种情况:

make:对“所有人”都不做任何事情

我还尝试了使用GCC进行普通编译:

gcc[BOOK]daytimetcpcli.c

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

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

接下来是我的第二个问题,在没有makefile的情况下如何编译?(使用带有正确-I标题的gcc)?gcc程序.c-I unp.h


*在官方网站提供的源代码中,在源代码中,注意“[BOOK]daytimetcpcli.c”=daytimetcpcli.c。

首先在Makefile中指出您的错误:

make:对“所有人”都不做任何事情

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

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

PROGS = [BOOK]daytimetcpcli.c ...

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


现在,您在编译命令中犯了错误:

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

这意味着您没有告诉gcc在哪里可以找到头文件。为什么它要与
make
一起工作?由于Makefile中的命令包含其他选项:
${CFLAGS}
${LIBS}
,因此在
Make.defines
中定义了两个变量(请参见
包含
行)

正确的编译命令应为:

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

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

直接编译时,显然缺少头文件。文件Make.defines正在设置CFLAGS以便可以找到它。我对
[BOOK]
字符感到惊讶,方括号是shell特有的。请改用下划线或将其完全删除。@icarus注意到并更正了这一点,谢谢,我不知道。阅读和
[BOOK]
的文档,以及出现的
[BOOK]
似乎令人困惑,可能应该用一些东西来代替else@BasileStarynkevitch是的,这是不寻常的、令人困惑的和容易出错的(shell的文件名扩展)。这就是为什么我在回答中添加了一个警告。但由于原始问题中使用了“[BOOK]”,因此在更改之前,我必须使用相同的名称。
PROGS = [BOOK]daytimetcpcli ...
gcc -o "[BOOK]daytimetcpcli" -I../lib -g -O2 -D_REENTRANT -Wall ../libunp.a -lpthread "[BOOK]daytimetcpcli.c"