我正在学习C ++。我想要一个makefile,它将编译当前目录中的所有cpp文件以分隔可执行文件。 例如:
在目录中有3个c ++文件,例如 examp1.cpp,examp2.cpp 和 examp3.cpp 。我想要一个makefile,它将编译并链接它们并提供 examp1.exe,examp2.exe 和 examp3.exe
我创建了一个bash脚本来编译所有这些脚本并创建exes但我认为;这不是确切的方法。
我有一个“.c”的Makefile,但这似乎不起作用。它只是创建目标文件而不是实际链接它。它如下:
SRCS=$(wildcard *.c)
OBJS=(SRCS:.c=.o)
all: $(OBJS)
上面的代码将所有新的和修改过的“.c”文件编译成当前目录中具有相同名称的“.o”文件。
我用来创建可执行文件的bash脚本如下:
for i in ./*.cpp
do
g++ -Wno-deprecated $i -o `basename $i .cpp`".exe"
done
这意味着我想要放在那个目录中的任何“.cpp”文件,使用一个简单的“make all”或者它应该编译的任何东西。
答案 0 :(得分:17)
执行您想要的最小Makefile:
#Tell make to make one .out file for each .cpp file found in the current directory
all: $(patsubst %.cpp, %.out, $(wildcard *.cpp))
#Rule how to create arbitary .out files.
#First state what is needed for them e.g. additional headers, .cpp files in an include folder...
#Then the command to create the .out file, probably you want to add further options to the g++ call.
%.out: %.cpp Makefile
g++ $< -o $@ -std=c++0x
您必须使用您正在使用的编译器替换g ++,并可能调整某些特定于平台的设置,但Makefile本身应该可以正常工作。
答案 1 :(得分:3)
这是我使用的Makefile
CC = gcc
CFLAGS = -g -O2 -std=gnu99 -static -Wall -Wextra -Isrc -rdynamic -fomit-frame-pointer
all: $(patsubst %.c, %.out, $(wildcard *.c))
%.out: %.c Makefile
$(CC) $(CFLAGS) $< -o $@ -lm
clean:
rm *.out
你应该将它粘贴在家里的某个地方,每当你改变目录时,只需将它复制到那里。我在〜/ .basrc中使用别名来复制它
alias get_makefile_here='cp ~/Makefile ./'
只需按make
和bam,即可完成。另请注意,一旦完成旧文件,它将无法重建其可执行文件。
答案 2 :(得分:1)
我的回答建立在@Haatschii
的答案之上我不希望我的二进制文件具有.out
前缀。我也使用他现有的Make语法来执行清理。
CXX=clang++
CXXFLAGS=-Wall -Werror -std=c++11
all: $(patsubst %.cpp, %.out, $(wildcard *.cpp))
%.out: %.cpp Makefile
$(CXX) $(CXXFLAGS) $< -o $(@:.out=)
clean: $(patsubst %.cpp, %.clean, $(wildcard *.cpp))
%.clean:
rm -f $(@:.clean=)
答案 3 :(得分:0)
您可以创建的最简单的makefile可能对您有用:
all: examp1.exe examp2.exe examp3.exe
这将使用make的默认规则来创建三个程序。