Makefile找不到目标文件
Makefile does not find object file
我希望在子目录中创建我的目标文件,而不是在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
,或者将目录设置为仅在它不存在时才构建的依赖项。
相关文章:
- 为测试目标创建具有不同源文件夹的文件
- 如何为包含头文件的目标编写生成文件?
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 生成文件:6:目标'all'的配方在 Ubuntu-16.04 上失败
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 使用 Libssh 将文件从服务器复制到客户端:分配文件复制目标路径时出现问题
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- 在目标计算机上访问 POSIX 信号灯时出现可执行文件崩溃(SEGV_MAPERR)
- 如何找到目标文件 *.o 的 ram rom 使用情况(.bss .text .rodata .data)?
- 如何使用cmake从主要的CMakeList.txt复制目标文件?
- 可变参数模板在目标文件中有重复的符号?
- 在 Linux 上,目标文件比在 macOS 或 Windows 上大 2.5 倍
- 为什么即使链接器找到目标文件,我的程序也看不到函数定义?
- 从.o目标文件中提取函数的原始机器代码?
- 使文件目标$(%符号)
- 针对不同生成文件目标的不同变量集
- 如何在不放置任何物理依赖项的情况下指定生成文件目标生成顺序
- extconf.rb:如何根据头文件更改生成生成文件目标
- 通过代码生成,使文件目标始终是最新的
- "Optional"生成文件中的目标文件目标?