Makefile, который компилирует все файлы cpp в каталоге в отдельный исполняемый файл - PullRequest
8 голосов
/ 20 марта 2012

Я сейчас изучаю C ++. Мне нужен make-файл, который скомпилирует все файлы cpp в текущем каталоге в отдельные исполняемые файлы. Например:

В каталоге есть 3 файла c ++, таких как examp1.cpp, examp2.cpp и examp3.cpp . Я хочу make-файл, который скомпилирует и свяжет их и выдаст examp1.exe, examp2.exe и examp3.exe

Я создал скрипт bash, чтобы скомпилировать их все и создать exe, но я думаю; это не точный способ сделать это.

У меня есть Makefile для ".c", но, похоже, он здесь не работает. Это только создание объектных файлов, а не их связывание. Это выглядит следующим образом:

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" или чего-то подобного, которое он должен компилировать.

Ответы [ 4 ]

17 голосов
/ 20 марта 2012

Минимальный 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 долженработа.

3 голосов
/ 10 августа 2013

Это 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, все готово.Также обратите внимание на тот факт, что, как только вы закончите со старыми файлами, они не будут перестраивать их исполняемый файл.

1 голос
/ 11 марта 2018

Мой ответ основан на ответе @ Haatschii

Я не предпочитаю иметь префикс .out для моих двоичных файлов. Кроме того, я использовал его существующий синтаксис Make, чтобы также выполнить clean.

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=)
0 голосов
/ 20 марта 2012

Самый простой make-файл, который вы можете создать, который может работать для вас, это:

all: examp1.exe examp2.exe examp3.exe

Это будет использовать правила make по умолчанию для создания ваших трех программ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...