【问题标题】:How to compile C code with the "Unix networking programming book" library?如何用“Unix网络编程书”库编译C代码?
【发布时间】:2018-02-28 23:43:57
【问题描述】:

简介

我已经开始关注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:“所有”都无事可做。

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

gcc [BOOK]daytimetcpcli.c

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

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

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

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

【问题讨论】:

  • 你直接编译的时候明显少了头文件。文件 Make.defines 正在设置 CFLAGS 以便它可以找到它。我对[BOOK] 字符感到惊讶,方括号对外壳来说是特殊的。尝试改用下划线或完全删除它们。
  • @icarus 注意到并纠正了谢谢,我不知道。
  • 阅读Modern CGCCGNU makeGDBthis draft report的文档

标签: debian makefile gcc c


【解决方案1】:

首先你在 Makefile 中的错误:

make:“所有”都无事可做。

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

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

PROGS = [BOOK]daytimetcpcli.c ...

PROGS = [BOOK]daytimetcpcli ...

顺便说一句,在文件名中使用[] 等特殊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"

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

【讨论】:

  • [BOOK] 的出现似乎令人困惑,可能应该用其他东西代替
  • @BasileStarynkevitch 是的,这是不寻常的、令人困惑的和容易出错的(shell 的文件名扩展)。这就是我在回答中添加警告的原因。但由于原始问题中使用的是“[BOOK]”,因此在更改之前我必须使用相同的名称。
猜你喜欢
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多