如何创建生成文件,为对象和可执行文件指定不同的目录
How to create makefile specifying ifferent directories for object and executable files
--folder
----book.h
----book.cpp
----library.h
----library.cpp
----main.cpp
这是目录结构,我已经创建了这个make文件,该文件在同一目录中生成对象文件和可执行文件。
main : main.o book.o library.o
g++ main.o book.o library.o -o main
main.o : main.cpp book.h library.h
g++ -c main.cpp
library.o : library.cpp library.h book.h
g++ -c library.cpp
book.o : book.cpp book.h
g++ -c book.cpp
clean:
rm -f *.o main
但是我想分别为文件夹中的目标文件和可执行文件创建文件夹obj和bin。我该怎么做?
也许是这样的
TARGET = bin/main
SOURCES = main.cpp book.cpp library.cpp
OBJ_DIR = obj
OBJECTS = $(SOURCES:%.cpp=$(OBJ_DIR)/*.o)
$(TARGET): $(OBJECTS)
$(LD) $(LDFLAGS) $^ -o $@ $(LIBS)
$(OBJ_DIR)/%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -c -o $@
这要求首先存在bin
和obj
目录。
阅读 GNU 制作手册 了解更多信息。
我有一些时间,所以我为你写了一个完整和自动化的Makefile。这将创建目录(如果它们不存在)。
BINDIR = bin/
OBJDIR = obj/
TARGET = $(BINDIR)target
SOURCES = main.cpp book.cpp library.cpp
LD = g++
OBJECTS = $(SOURCES:%.cpp=$(OBJDIR)%.o)
.PHONY: all
all: target
.PHONY: target
target: before_target actual_target after_target
.PHONY: before_target
before_target: $(OBJDIR) $(BINDIR)
.PHONY: actual_target
actual_target: $(TARGET)
.PHONY: after_target
after_target:
$(TARGET): $(OBJECTS)
$(LD) $(LDFLAGS) $^ -o $@ $(LIBS)
$(OBJDIR)%.o: %.cpp
$(CXX) $(CXXFLAGS) $^ -c -o $@
$(OBJDIR) $(BINDIR):
mkdir $@
.PHONY: clean
clean:
-rm -rf $(BINDIR)
-rm -rf $(OBJDIR)
使用 VPATH!这是一篇出色(且详细)的文章,向您展示了如何:多架构构建。
这是基本理论:
首先,将有一个单级递归。这将处理自动cd
到 obj
ect 目录中,而不是出于任何目录层次结构的原因。
其次,您将使用 VPATH
指定源代码相对于对象目录的位置:VPATH=../src
第三。。。嗯......利润!
下面是一个简化的示例(未测试)。您可以对此进行扩展,或按照文章进行操作以获得"更丰富"的版本:
ifneq (obj,$(notdir $(CURDIR)))
# Not in object directory, so we must be in root (src) directory!
.SUFFIXES:
OBJDIR := obj
MAKETARGET = $(MAKE) --no-print-directory -C $@ -f $(CURDIR)/Makefile
SRCDIR=$(CURDIR) $(MAKECMDGOALS)
.PHONY: $(OBJDIR)
$(OBJDIR):
;+@[ -d $@ ] || mkdir -p $@
+@$(MAKETARGET)
Makefile : ;
%.mk :: ;
% :: $(OBJDIR) ; :
.PHONY: clean
clean:
rm -rf $(OBJDIR)
else
VPATH=../src
CXX := g++ # The default, just so you know it's here
# CXXFLAGS = ...
# LDFLAGS = ...
# LDLIBS = ...
main : main.o book.o library.o
main.o : main.cpp book.h library.h
library.o : library.cpp library.h book.h
book.o : book.cpp book.h
endif
您只需在
对象前面加上 obj/
,在可执行文件前面加上 bin/
,并添加一个命令以使目录mkdir -p bin
等。
# make your subfolders targets
all: bin obj bin/main
bin/main : obj/main.o obj/book.o obj/library.o
g++ -o bin/main obj/main.o obj/book.o obj/library.o
obj/main.o : main.cpp book.h library.h
g++ -c -o obj/main.o main.cpp
obj/library.o : library.cpp library.h book.h
g++ -c -o obj/library.o library.cpp
obj/book.o : book.cpp book.h
g++ -c -o obj/book.o book.cpp
# create subfolders if not present
bin obj:
mkdir -p bin
mkdir -p obj
clean:
rm -f bin/* obj/*
然后只需键入 make
(使 targer all
)。
相关文章:
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- C++模板的对象代码是否在可执行文件和动态库中重复?
- C++ 可执行文件错误:无法打开共享对象文件:没有此类文件或目录
- 如何将C++对象文件链接到C可执行文件
- "make"的输出是一个共享对象,而不是可执行文件
- 如何创建生成文件,为对象和可执行文件指定不同的目录
- 为什么 GNU ld 在链接可执行文件和共享对象时以不同的方式解析符号
- 如何找到C++可执行文件的所有对象(类对象/结构)
- 代码对象和可执行文件的区别
- Android OS框架-将单个可执行文件构建为共享对象
- GCC可以编译和运行源代码而不生成对象或可执行文件吗?