我有一个make文件,我试图使它们通用 但它不断使它缺少包含目录 这是makefile:
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
当我制作时:制作-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
答案 0 :(得分:2)
您没有建立目标文件的规则:您仅定义了一条规则来将目标文件链接到最终的可执行文件中。如评论中所述,将$(INCLUDES)
添加到该配方中是没有用的,因为仅在编译(创建目标文件)而不链接(将目标文件和库转换为可执行文件)期间使用头文件目录。
由于尚未定义自己的规则来构建目标文件,因此使用了make的内置规则。但是make的内置规则对名为INCLUDES
的变量一无所知,因此在编译期间不会使用该变量。通过查看make生成的编译器命令,您可以轻松地看到这一点。
您需要(a)创建自己的规则来编译使用您的个人make变量的目标文件,或者(b)使用正常的built-in variables,make希望将其与内置规则一起使用。
对于(b),如手册中所述,您应采用当前的CPPFAGS
[sic]变量并将其重命名为CXXFLAGS
,并采用当前的INCLUDES
变量并将其重命名CPPFLAGS
,获取当前的LIBS_DIRS
变量并将其重命名为LDFLAGS
,并获取当前的LDFLAGS
变量并将其重命名为LDLIBS
。
还要注意,您有DEPS
等,但是您的makefile中没有任何东西可以对它们进行任何操作或创建它们,因此它们无用。