我开始关注Unix网络编程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的情况下编译? (使用带有正确-I标头的gcc)? gcc program.c -I unp.h?
*注意'[BOOK] daytimetcpcli.c’= daytimetcpcli.c在官方网站上提供的源代码中.
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文件时使用)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。