user63898
user63898

Reputation: 30885

Makefile missing include path Although the path exists and defined

i have make file which i try to make them generic but it keeps to compline it missing include directory this is the 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

when i make : 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

when i invoke make , im getting this error:

 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

but the uv do exist in : /home/vagrant/libuv/include

Upvotes: 0

Views: 782

Answers (1)

MadScientist
MadScientist

Reputation: 100781

You have no rule to build your object files: you've only defined a rule to link your object files into a final executable. As mentioned in the comments, adding $(INCLUDES) into that recipe is useless because header file directories are only used during compiling (creating object files) not linking (converting object files and libraries into executables).

Because you haven't defined your own rule to build object files, you're using make's built-in rule. But make's built-in rule doesn't know anything about a variable named INCLUDES, so that variable is not used during compilation. You can easily see this by looking at the compiler commands generated by make.

You need to either (a) create your own rule for compiling object files that uses your personal make variables, or (b) use the normal built-in variables that make expects to be used with its built-in rules.

For (b), as described in the manual, you should take your current CPPFAGS [sic] variable and rename it to CXXFLAGS, take your current INCLUDES variable and rename it CPPFLAGS, take your current LIBS_DIRS variable and rename it LDFLAGS, and take your current LDFLAGS variable and rename it to LDLIBS.

Also just to note, you have DEPS etc. but there is nothing in your makefile that does anything with them or to create them so they're useless.

Upvotes: 1

Related Questions