Простые make-файлы для gcc / g ++ - PullRequest
1 голос
/ 19 сентября 2010

Мои проекты всегда состоят из:

  1. Пары Foo.h и Foo.cpp

  2. Некоторые дополнительные заголовки util.h и т. Д.

Какой самый простой способ написать make-файл, который

  • Работает

    $CC -c foo.cpp
    

для каждого файла .cpp, сохраняя зависимость от его основного файла .h

  • Предоставляет способ ручного добавления дополнительных зависимостей
  • Включает шаг связывания с моей ручной переменной $ LIBS set.

Я работаю с Linux (Ubuntu) и gcc / g ++.

Ответы [ 6 ]

3 голосов
/ 20 сентября 2010

Пожалуйста, просто используйте automake. Вы получите надлежащее отслеживание зависимостей, make-файлы, которые соответствуют GNU Makefile Standards (например, make install делает правильные вещи и учитывает DESTDIR и prefix), возможность проверять наличие системных ошибок при необходимости и поддержка для создания правильных дистрибутивов.

Это минимальный configure.ac:

                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.61])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE([foreign])

# Checks for programs.
AC_PROG_CXX

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

и минимальный Makefile.am:

## Process this file with automake to generate Makefile.in
bin_PROGRAMS = foo
foo_SOURCES = foo.cpp bar.h baz.h quux.cpp

Запустите autoreconf -i, чтобы сгенерировать скрипт конфигурации, затем ./configure и make.

Вот отличное руководство по .

2 голосов
/ 19 сентября 2010

Возможно, вы можете проверить CMake ?

Если вы не знакомы с CMake, то это в основном генератор Makefile (или XCode, или проекты Visual Studio и т. Д., В зависимости от платформы), поэтому он позволяет вам указать только необходимые переменные и позаботится о проблемах с зависимостями заголовка, генерации make-файла и т. д.

1 голос
/ 09 мая 2014

Вот простой сценарий оболочки, который создает make-файл из всех файлов .cpp в данном каталоге:

# !sh    
if [ $# = 0 ]
then
echo -e "please give executable name"
exit 1
fi

echo -e -n "CC=g++\nOPTIMS=\nLIBS= " > makefile

echo >> makefile
echo -n "$1: " >> makefile
for fic in *.cpp
do
echo -n "${fic%\.cpp}.o " >> makefile
done

echo >> makefile
echo -n -e "\t\$(CC) " >> makefile
for fic in *.cpp
do
echo -n "${fic%\.cpp}.o " >> makefile
done
echo -n -e "-o $1 \$(OPTIMS) \$(LIBS)\n" >> makefile

echo >> makefile
for fic in *.cpp
do
g++ -MM $fic >> makefile
echo -e "\t\$(CC) -c $fic \$(OPTIMS)\n" >> makefile
done

exit 0

Он использует опцию -MM gcc для создания строк зависимостей make-файла.Просто создайте сценарий в каталоге исходных текстов (назовем его micmake), сделайте его исполняемым (chmod +x micmake) и введите

./micmake go

. Он создаст make-файл, и команда make скомпилируетпроект.Исполняемый файл называется go.Вы можете редактировать make-файл, если вам нужны специальные параметры компиляции или библиотеки.Для более сложных проектов и зависимостей вы должны использовать automake, cmake или scons.

1 голос
/ 20 сентября 2010

Как насчет этого:

%.o: %.cpp %.h
    $(CC) -c $< -o $@

# Some things have extra dependencies. (Headers like util.h are unlikely
# to change, but you can handle them this way if you really want to.)
#
# foo.o and bar.o both depend on baz.h
foo.o bar.o: baz.h

# foo.o also depends on gab.h and jig.h
foo.o: gab.h jig.h

# You will need a list of object files. You can build it by hand:
OBJ_FILES = foo.o bar.o snaz.o # and so on

# ...or just grab all the files in the source directory:
SOURCE_FILES = $(wildcard *.cpp)
OBJ_FILES = $(SOURCE_FILES:.cpp=.o)

# It is possible to get this from the environment, but not advisable.
LIBS = -lred -lblue

final-thing: $(OBJ_FILES)
    $(CC) $(LIBS) $^ -o $@
0 голосов
/ 19 сентября 2010

Вот пример из одного из моих проектов - вы можете просто добавить туда новые пары foo1.cc и foo1.h, и они будут автоматически созданы для вас:

# determine all sources and from that all targets
sources :=              $(wildcard *.cpp)
programs :=             $(sources:.cpp=)

## compiler etc settings used in default make rules 
CXX :=                  g++
CPPFLAGS :=             -Wall 
CXXFLAGS :=             -O3 -pipe 
LDLIBS :=  

# build all and strip programs afterwards 
all:                    $(programs) 
                        @test -x /usr/bin/strip && strip $^ 
0 голосов
/ 19 сентября 2010
...