Makefile 缺少包含路径 虽然路径存在并已定义

Posted

技术标签:

【中文标题】Makefile 缺少包含路径 虽然路径存在并已定义【英文标题】:Makefile missing include path Although the path exists and defined 【发布时间】:2019-12-26 09:16:20 【问题描述】:

我有制作文件,我试图让它们通用 但它不断补充它缺少包含目录 这是生成文件:

CXX=g++
CPPFAGS= -Wall -O0 -g -std=c++14
INCLUDES = -I/home/vagrant/libuv/include -Isrc
LIBS_DIRS = -L/home/vagrant/libuv/build
LDFLAGS= -lssl -lcrypto
LIB_STATIC = -Wl,--no-as-needed -Bstatic -luv_a -ldl -lpthread
SOURCE = $(wildcard echo.cpp) \
         $(wildcard src/*.cpp)
OBJ = $(SOURCE:.cpp=.o)
DEP = $(OBJ:.o=.d)
TARGET = myproj


$(TARGET) : $(OBJ)
        $(CXX) $(CPPFLAGS) $(INCLUDES) -o $@ $^ $(LIBS_DIRS) $(LDFLAGS) $(LIB_STATIC)

all: $(TARGET)

clean:
        rm -f $(OBJ) $(TARGET)
cleandep:
        rm -f $(DEP)

.PHONY:all clean cleandep

当我制作时:make -n:

   make -n
g++    -c -o echo.o echo.cpp
g++    -c -o src/base64.o src/base64.cpp
g++    -c -o src/Server.o src/Server.cpp
g++    -c -o src/sha1.o src/sha1.cpp
g++    -c -o src/Client.o src/Client.cpp
g++  -I/home/vagrant/libuv/include -Isrc -o myproj echo.o src/base64.o src/Server.o src/sha1.o src/Client.o -L/home/vagrant/libuv/build -lssl -lcrypto  -Wl,--no-as-needed -Bstatic -luv_a -ldl -lpthread

当我调用 make 时,我得到这个错误:

 make
g++    -c -o echo.o echo.cpp
In file included from src/Server.h:9:0,
                 from echo.cpp:1:
src/Client.h:6:10: fatal error: uv.h: No such file or directory
 #include <uv.h>
          ^~~~~~
compilation terminated.
make: *** [echo.o] Error 1

但是 uv 确实存在于:/home/vagrant/libuv/include

【问题讨论】:

linker 调用指定包含路径是没有意义的。您需要为 compiler 调用指定一个。你没有这样做。 你能提示我在哪里修复它吗? 【参考方案1】:

您没有规则来构建您的目标文件:您只定义了一个规则来将您的目标文件链接到最终的可执行文件中。正如 cmets 中提到的,将 $(INCLUDES) 添加到该配方中是没有用的,因为头文件目录仅在编译(创建目标文件)而不是链接(将目标文件和库转换为可执行文件)期间使用。

因为您还没有定义自己的规则来构建目标文件,所以您使用的是 make 的内置规则。但是 make 的内置规则对名为 INCLUDES 的变量一无所知,因此在编译期间不会使用该变量。您可以通过查看 make 生成的编译器命令轻松看到这一点。

您需要 (a) 创建自己的规则来编译使用您的个人 make 变量的目标文件,或者 (b) 使用 make 期望与其内置规则一起使用的普通 built-in variables。

对于 (b),如手册中所述,您应该将当前的 CPPFAGS [sic] 变量重命名为 CXXFLAGS,将当前的 INCLUDES 变量重命名为 CPPFLAGS,将您的当前的LIBS_DIRS 变量并将其重命名为LDFLAGS,并将您当前的LDFLAGS 变量重命名为LDLIBS

还需要注意的是,您有 DEPS 等,但您的 makefile 中没有任何内容可以对它们进行任何操作或创建它们,因此它们无用。

【讨论】:

以上是关于Makefile 缺少包含路径 虽然路径存在并已定义的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Makefile 中定义多个包含路径

makefile : 如何链接来自不同子目录的目标文件并包含不同的搜索路径

具有到父级的相对包含路径的 C++ makefile

8.Makefile路径搜索使用案例

8.Makefile路径搜索使用案例

更新linux中的包含路径