gpt4 book ai didi

c++ - Makefile 没有找到目标文件

转载 作者:行者123 更新时间:2023-11-30 05:40:36 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于c++ - Makefile 没有找到目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31551031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com