Makefile 没有找到目标文件

Makefile does not find object file

我希望在子目录中创建我的目标文件,而不是 Makefile 所在的位置。所以,我看到了这个 answer,我无法将其应用到我的案例中,所以我尝试了这个:

OBJS    = main.o    IO.o    alloc.o communication.o
OBJSDIR    =   obj
SOURCE  = main.cpp  src/IO.cpp  src/alloc.cpp   src/communication.cpp
HEADER =    headers/IO.h    headers/alloc.h headers/communication.h
OUT     =       test
CXX     = ../../mpich-install/bin/mpic++
CXXFLAGS    =   -I../../intel/mkl/include   -Wl,--start-group    -Wl,--end-group    -lpthread   -lm -ldl    -Wall
LDFLAGS   =       ../../intel/mkl/lib/intel64/libmkl_scalapack_lp64.a       -Wl,--start-group       ../../intel/mkl/lib/intel64/libmkl_intel_lp64.a ../../intel/mkl/lib/intel64/libmkl_core.a  ../../intel/mkl/lib/intel64/libmkl_sequential.a    -Wl,--end-group ../../intel/mkl/lib/intel64/libmkl_blacs_intelmpi_lp64.a -lpthread       -lm     -ldl

all:    $(OBJSDIR)  $(OUT)

$(OBJSDIR):
    mkdir   $(OBJSDIR)

$(OUT): $(OBJS)
    $(CXX)  $(OBJS) -o  $(OUT)  $(CXXFLAGS) $(LDFLAGS)
#   make    -f  Makefile    clean

# create/compile the individual files >>separately<<
$(OBJSDIR)/main.o:    main.cpp
    $(CXX)  -c  main.cpp    $(CXXFLAGS)

$(OBJSDIR)/IO.o:    src/IO.cpp
    $(CXX)  -c  src/IO.cpp  $(CXXFLAGS)

$(OBJSDIR)/alloc.o:    src/alloc.cpp
    $(CXX)  -c  src/alloc.cpp   $(CXXFLAGS)

$(OBJSDIR)/communication.o:    src/communication.cpp
    $(CXX)  -c  src/communication.cpp   $(CXXFLAGS)

.PHONY: clean
clean:
    rm  -rf *.o

我得到:

gsamaras@pythagoras:~/konstantis/cholesky$ make
../../mpich-install/bin/mpic++ -I../../intel/mkl/include        -Wl,--start-group        -Wl,--end-group        -lpthread       -lm     -ldl    -Wall   -c -o main.o main.cpp
make: *** No rule to make target 'IO.o', needed by 'test'.  Stop.

我有一个 src 文件夹,其中包含所有 .cpp 文件(main.cpp 除外,它与 Makefile 位于同一目录中)和一个 headers 目录,其中包含所有头文件。


编辑

我修改了前两行,如下:

OBJSDIR    =   obj
OBJS    = $(OBJSDIR)/main.o $(OBJSDIR)/IO.o $(OBJSDIR)/alloc.o  $(OBJSDIR)/communication.o

我得到:

g++: error: obj/main.o: No such file or directory
...

问题出在主目录下还是生成了object文件!

您想更改调用编译器的行:

$(OBJSDIR)/IO.o:    src/IO.cpp
    $(CXX)  -c  src/IO.cpp  $(CXXFLAGS)

至:

$(OBJSDIR)/IO.o:    src/IO.cpp
    $(CXX)  -c  src/IO.cpp  $(CXXFLAGS) -o $@

注意$@是对应正在创建的目标文件的automatic variable。所以在上面的例子中它将是 obj/IO.o-o 指定输出文件名。

此外,虽然这与您的问题无关,但将所有构建工件放入单独目录的好处之一是清理起来要容易得多:

clean:
    rm -rf $(OBJSDIR) $(OUT)

此外,作为最后的说明,如果您希望进行并行构建,您将遇到一个问题,因为您的目标文件依赖于构建目录。有几个解决方案,包括在每次编译器调用之前调用 mkdir -p objs 或将目录设置为 dependency that is only built if it does not exist.