GNU make问题:"没有规则要制作目标`pjsip.h',需要`main.o'"

时间:2016-09-13 11:54:40

标签: c++ makefile gnu-make

我一直在努力编写我的第一个makefile,在完成了一些教程并阅读了stackoverflow上的一些链接后,我设法编写了文件,我正在做的是

  • 使用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的额外评论

提前致谢

2 个答案:

答案 0 :(得分:3)

以下规则:

main.o: main.cpp pjsip.h pjlib.h pjlib-utils.h

指定main.o需要所有列出的文件才能构建。

当前目录中没有任何名为pjsip.h的文件。这是make告诉您的内容:此文件不存在,并且没有明确的规则来创建此文件。

您显示的错误消息来自makemake没有查看,并且不关心您将一些-I标志传递给名为g++的名为main.o的奇怪命令,该命令被执行以构建makeg++100%一无所知,也不知道传递给它的任何标志。所有知道或关心的都是明确列出的目标和规则。

答案 1 :(得分:3)

问题是您将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 ...

(...和其他标题类似) 顺便说一句,“ - I”选项只接受目录(参见g ++ documentation on directory search),因此PJSIP_HDR的定义中包含头文件名是没有意义的,它应该只是:< / p>

PJSIP_HDR = -I/home/ubuntu/pjsip/trunk/pjsip/include/

由于错误,您可能添加了标题名称?

第二个更简单的选择是简单地删除那些外部依赖项。只需写下

main.o: main.cpp

即省略所有库头文件。如果依赖关系发生了变化,我们会告诉make重建东西。我假设那些pjsip.h,pjlib.h,...来自一个你不经常改变的外部库?然后使它成为make中的依赖并不是必需的。

顺便说一下,这些日子里文件很难用手写;它们通常由cmake等工具生成。