GNU make 问题:"No rule to make target `pjsip.h', needed by `main.o'"
GNU make issue: "No rule to make target `pjsip.h', needed by `main.o'"
我一直在努力编写我的第一个 makefile,在学习了一些教程并阅读了 Whosebug 上的一些链接之后,我设法编写了该文件,我正在做的是
- 使用 pjsip api 中的 .a 文件,注意变量 PJSIP、PJLIB_UTIL 和 PJLIB
- 使用-I选项定义.h文件的路径,参见变量PJSIP_HDR、PJLIB_HDR和PJLIB_U_HDR
我收到以下错误:
make: ***No rule to make target `pjsip.h', needed by `main.o'. Stop.
我认为在我的 .cpp 文件
中只有 4 个 #includes 是有用的
#include <iostream>
#include <pjsip.h>
#include <pjlib-util.h>
#include <pjlib.h>
目标是有一个我可以执行的名为 main 的文件,我正在使用 Ubuntu 14.04 。这是我的 makefile
CC = g++
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
PJSIP = -L/home/ubuntu/pjsip/trunk/pjsip/lib -llibpjsip-simple-x86_64-unknown-linux-gnu.a -llibpjsip-ua-x86_64-unknown-linux-gnu.a -llibpjsip-x86_64-unknown-linux-gnu.a -llibpjsua2-x86_64-unknown-linux-gnu.a -llibpjsua-x86_64-unknown-linux-gnu.a
PJLIB = -L/home/ubuntu/pjsip/trunk/pjlib/lib -llibpj-x86_64-unknown-linux-gnu.a
PJLIB_UTIL = -L/home/ubuntu/pjsip/trunk/pjlib-utils/lib -llibpjlib-util-x86_64-unknown-linux-gnu.a
PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/
PJLIB_HDR = -I/home/ubuntu/pjsip/trunk/pjlib/include/
PJLIB_U_HDR = -I/home/ubuntu/pjsip/trunk/pjlib-utils/include
main: main.o
$(CC) $(LFLAGS) main.o -o main
main.o: main.cpp pjsip.h pjlib.h pjlib-utils.h
$(CC) $(CFLAGS) $(PJSIP_HDR) $(PJLIB_HDR) $(PJLIB_U_HDR) main.cpp $(PJSIP) $(PJLIB) $(PJLIB_UTIL)
clean:
\rm -f *.o
欢迎任何可能帮助我改进 makefile 的额外评论
提前致谢
以下规则:
main.o: main.cpp pjsip.h pjlib.h pjlib-utils.h
指定 main.o
需要所有列出的文件才能构建。
您在当前目录中没有任何名为 pjsip.h
的文件。这就是 make
告诉你的:这个文件不存在,也没有明确的规则来创建这个文件。
您显示的错误消息来自 make
。 make
不会查看,也不关心您将一些 -I
标志传递给一些名为 g++
的奇怪命名的命令,该命令被执行以构建 main.o
。 make
对 g++
一无所知,也不知道传递给它的任何标志。唯一让人知道或关心的是明确列出的目标和规则。
问题是您将 pjsjp.h 指定为依赖项(即,在 main.o
目标行中的“:”之后);但是 make
不知道如何找到包含文件 pjsip.h
- 它不解释 -I ...
选项,这些选项仅适用于 g++ 命令。
您可以尝试指定绝对路径,如下所示:
PJLIB_HEADER_DIR=/home/ubuntu/pjsip/trunk/pjlib/include
main.o: main.cpp $(HEADER_DIR)/pjlib.h ...
(...和其他 headers 类似)
顺便说一句,“-I”选项只接受目录(参见 g++ documentation on directory search),因此其中包含 header 文件名的 PJSIP_HDR
的定义没有意义,它应该只是:
PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/
您添加的 header 名称可能是因为错误?
第二个更简单的选择是简单地删除那些外部依赖项。随便写
main.o: main.cpp
即省略所有库 header 文件。如果依赖项已更改,则依赖项会告诉 make 重建内容。我假设那些 pjsip.h、pjlib.h、...来自您不经常更改的外部库?那么使它成为 make 的依赖并不是真正必要的。
顺便说一句,现在手写make文件已经很少了;它们通常由 cmake.
等工具生成
我一直在努力编写我的第一个 makefile,在学习了一些教程并阅读了 Whosebug 上的一些链接之后,我设法编写了该文件,我正在做的是
- 使用 pjsip api 中的 .a 文件,注意变量 PJSIP、PJLIB_UTIL 和 PJLIB
- 使用-I选项定义.h文件的路径,参见变量PJSIP_HDR、PJLIB_HDR和PJLIB_U_HDR
我收到以下错误:
make: ***No rule to make target `pjsip.h', needed by `main.o'. Stop.
我认为在我的 .cpp 文件
中只有 4 个 #includes 是有用的#include <iostream>
#include <pjsip.h>
#include <pjlib-util.h>
#include <pjlib.h>
目标是有一个我可以执行的名为 main 的文件,我正在使用 Ubuntu 14.04 。这是我的 makefile
CC = g++
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
PJSIP = -L/home/ubuntu/pjsip/trunk/pjsip/lib -llibpjsip-simple-x86_64-unknown-linux-gnu.a -llibpjsip-ua-x86_64-unknown-linux-gnu.a -llibpjsip-x86_64-unknown-linux-gnu.a -llibpjsua2-x86_64-unknown-linux-gnu.a -llibpjsua-x86_64-unknown-linux-gnu.a
PJLIB = -L/home/ubuntu/pjsip/trunk/pjlib/lib -llibpj-x86_64-unknown-linux-gnu.a
PJLIB_UTIL = -L/home/ubuntu/pjsip/trunk/pjlib-utils/lib -llibpjlib-util-x86_64-unknown-linux-gnu.a
PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/
PJLIB_HDR = -I/home/ubuntu/pjsip/trunk/pjlib/include/
PJLIB_U_HDR = -I/home/ubuntu/pjsip/trunk/pjlib-utils/include
main: main.o
$(CC) $(LFLAGS) main.o -o main
main.o: main.cpp pjsip.h pjlib.h pjlib-utils.h
$(CC) $(CFLAGS) $(PJSIP_HDR) $(PJLIB_HDR) $(PJLIB_U_HDR) main.cpp $(PJSIP) $(PJLIB) $(PJLIB_UTIL)
clean:
\rm -f *.o
欢迎任何可能帮助我改进 makefile 的额外评论
提前致谢
以下规则:
main.o: main.cpp pjsip.h pjlib.h pjlib-utils.h
指定 main.o
需要所有列出的文件才能构建。
您在当前目录中没有任何名为 pjsip.h
的文件。这就是 make
告诉你的:这个文件不存在,也没有明确的规则来创建这个文件。
您显示的错误消息来自 make
。 make
不会查看,也不关心您将一些 -I
标志传递给一些名为 g++
的奇怪命名的命令,该命令被执行以构建 main.o
。 make
对 g++
一无所知,也不知道传递给它的任何标志。唯一让人知道或关心的是明确列出的目标和规则。
问题是您将 pjsjp.h 指定为依赖项(即,在 main.o
目标行中的“:”之后);但是 make
不知道如何找到包含文件 pjsip.h
- 它不解释 -I ...
选项,这些选项仅适用于 g++ 命令。
您可以尝试指定绝对路径,如下所示:
PJLIB_HEADER_DIR=/home/ubuntu/pjsip/trunk/pjlib/include
main.o: main.cpp $(HEADER_DIR)/pjlib.h ...
(...和其他 headers 类似)
顺便说一句,“-I”选项只接受目录(参见 g++ documentation on directory search),因此其中包含 header 文件名的 PJSIP_HDR
的定义没有意义,它应该只是:
PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/
您添加的 header 名称可能是因为错误?
第二个更简单的选择是简单地删除那些外部依赖项。随便写
main.o: main.cpp
即省略所有库 header 文件。如果依赖项已更改,则依赖项会告诉 make 重建内容。我假设那些 pjsip.h、pjlib.h、...来自您不经常更改的外部库?那么使它成为 make 的依赖并不是真正必要的。
顺便说一句,现在手写make文件已经很少了;它们通常由 cmake.
等工具生成