Makefile для компиляции нескольких .cpp и .h в lib - PullRequest
3 голосов
/ 22 июня 2010

Я использую Windows 7 с gcc / g ++ под Cygwin. Каким будет формат Makefile (и расширение, я думаю, это .mk?) Для компиляции набора файлов .cpp (источник C ++) и .h (заголовок) в статическую библиотеку (.dll). Скажем, у меня есть набор переменных файлов:

  • file1.cpp
  • file1.h

  • file2.cpp

  • file2.h

  • file3.cpp

  • file3.h

  • ....

Каким был бы формат make-файла (и расширение) для его компиляции в статическую библиотеку? (Я очень новичок в makefiles) Какой самый быстрый способ сделать это?

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Есть много опций, которые вы можете установить при создании dll, но вот основная команда, которую вы могли бы использовать, если бы делали это из командной строки:

gcc -shared -o mydll.dll file1.o file2.o file3.o

А вот make-файл (обычно называемый Makefile), который будет обрабатывать весь процесс сборки:

# You will have to modify this line to list the actual files you use.
# You could set it to use all the "fileN" files that you have,
# but that's dangerous for a beginner.
FILES = file1 file2 file3

OBJECTS = $(addsuffix .o,$(FILES)) # This is "file1.o file2.o..."

# This is the rule it uses to assemble file1.o, file2.o... into mydll.dll
mydll.dll: $(OBJECTS)
    gcc -shared $^ -o $@    # The whitespace at the beginning of this line is a TAB.

# This is the rule it uses to compile fileN.cpp and fileN.h into fileN.o
$(OBJECTS): %.o : %.cpp %.h
    g++ -c $< -o $@         # Again, a TAB at the beginning.

Теперь, чтобы собрать mydll.dll, просто наберите "make".

Пара заметок. Если вы просто наберете «make», не указав makefile или цель (объект, который будет собран), Make попытается использовать make-файл по умолчанию («GNUMakefile», «makefile» или «Makefile») и цель по умолчанию (первый один в make-файле, в данном случае mydll.dll).

2 голосов
/ 22 июня 2010

Расширения не будет вообще, и файл называется Makefile, если вы хотите, чтобы GNU make автоматически его находил.

Make имеет автоматические переменные, которые сами по себе дают вам контроль над большей частью процесса сборки из C/ C ++ файлы.Эти переменные включают CC, CPP, CFLAGS, CPPFLAGS, CXX, CXXFLAGS и LDFLAGS.Они будут управлять переключениями на препроцессор C / C ++, объект компилятора и платформы и компоновщик программы (программа, которая генерирует так называемый «исполняемый файл программы», или просто говорит: «программа, которую вы компилируете»).

GNU make также включает в себя множество неявных правил, специально разработанных для обеспечения возможности сборки программ из исходного кода C / C ++, поэтому вам не нужно писать их с нуля.

Например, даже без make-файл, если вы попытаетесь make foobar, GNU Make попытается сначала собрать foobar.o из foobar.c или foobar.cpp, если найдет один из них, вызвав соответствующий компилятор, а затем попытается собрать foobarпутем сборки (включая связывание) его частей из системных библиотек и foobar.o.Короче говоря, GNU Make знает, как собрать программу foobar даже без наличия make-файла - благодаря неявным правилам.Вы можете увидеть эти правила, вызвав Make с переключателем -p, например, make -p.

Некоторым людям нравится полагаться на базу данных неявных правил GNU Make, чтобы иметь короткие и короткие make-файлы, где только это относится к их проектууказано, в то время как некоторые люди могут пойти так далеко, чтобы отключить всю базу данных неявных правил (используя переключатель -r) и получить полный контроль над процессом сборки, задав все с нуля.Я не буду комментировать обоснованность какой-либо стратегии, но будьте уверены, что оба работают в некоторой степени.

...