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.
我希望在子目录中创建我的目标文件,而不是 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.