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在官方网站上提供的源代码中.
首先你在 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隐式编译的文件时使用)