Makefile找不到目标文件

Makefile does not find object file

本文关键字:文件 目标 找不到 Makefile      更新时间:2023-10-16

我希望在子目录中创建我的目标文件,而不是在Makefile所在的位置。所以,我看到了这个答案,我不能用在我的情况下,所以我试着这样做:

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相同的目录中)和一个头目录,其中所有的头文件存在。


编辑

我修改了前两行,如下所示:

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
...

问题在于目标文件仍然在主目录中生成!

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

$(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 $@

注意,$@是与正在创建的目标文件相对应的自动变量。在上面的例子中是obj/IO.o-o为输出文件名。

此外,虽然它与你的问题无关,但将所有构建工件放在单独的目录中的好处之一是更容易清理:

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

另外,作为最后的注意事项,如果您希望进行并行构建,您将遇到问题,因为您的目标文件依赖于构建目录。有几个解决方案可以解决这个问题,包括在每次编译器调用之前调用mkdir -p objs,或者将目录设置为仅在它不存在时才构建的依赖项。