Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: помогите написать Makefile  (Прочитано 2166 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jec

  • Автор темы
  • Любитель
  • *
  • Сообщений: 82
    • Просмотр профиля
помогите написать Makefile
« : 26 Августа 2010, 23:09:41 »
вот прочитал эту статью:
https://forum.ubuntu.ru/index.php?topic=100976.0
и так и не разобрался как сделать универсальный makefile

только у меня условия немного другие
- есть папка в которой все лежит называется она test (например)
- в папке test есть папи source (там лежат все исходники), и папка bin в которой будут лежать файлы на выходе (исполняемые) и есть еще одна папка obj в которой лежат все файлы .o
- имя исходного когда (откуда все начинается), имя полученого файла и название дириктории совподают (тоесть если папка test то будут test.cpp и имя на выходе test)

помгите написать такой вот Makefile

Оффлайн arrecck

  • Старожил
  • *
  • Сообщений: 1726
    • Просмотр профиля
Re: помогите написать Makefile
« Ответ #1 : 26 Августа 2010, 23:44:51 »
а что не выходит?

Оффлайн jec

  • Автор темы
  • Любитель
  • *
  • Сообщений: 82
    • Просмотр профиля
Re: помогите написать Makefile
« Ответ #2 : 26 Августа 2010, 23:53:48 »
все =(
как сделать допустим что бы имя файлы было такое же как и папка
и как сделать что бы файлы кидались в папку какую я напишу

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
Re: помогите написать Makefile
« Ответ #3 : 27 Августа 2010, 00:37:43 »
Не универсальный Makefile приблизительно будет выглядеть так:


SRC_DIR=./src
OBJ_DIR=./obj
TARGET_DIR=./bin

SRC=$(SRC_DIR)/test.cpp
OBJ=$(OBJ_DIR)/test.o


TARGET=$(TARGET_DIR)/test

all: $(SRC) $(TARGET)

$(TARGET): $(OBJ_DIR)/test.o
$(CC) $(LDFLAGS) $(LIB) $< -o $@

$(OBJ_DIR)/test.o : $(SRC_DIR)/test.cpp
$(CC) $(CXXLFAGS) $(INCLUDE) -c $< -o $@


.PHONY clean:
-rm -f $(OBJ)
-strip $(TARGET)
    
distclean:
-rm -f $(OBJ)
-rm -f $(TARGET)

Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: помогите написать Makefile
« Ответ #4 : 27 Августа 2010, 02:53:03 »
Зачем же себе усложнять жизнь ненужными кастомизациями?

В том Makefile который я привёл в той статье обрати внимание на строки
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:%.cpp=%.o)
Первая складывает в переменную SOURCES список всех файлов удовлетворяющих маске.
Вторая делает строковую замену .cpp на .o у всех элементов в переменной SOURCES и складывает значения в переменную OBJECTS

Немного проявив изобретательность можно поменять эти строки на
SOURCES=$(wildcard src/*.cpp)
OBJECTS=$(SOURCES:src%.cpp=obj%.o)
Но тут вылезет маленькая проблема. Строка в Makefile из моей статьи
$(OBJECTS): $(SOURCES)
использует предопределённое неявное правило (см. здесь)
%.o: %.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<
которое предпологает, что объектные файлы нужно создавать там же где лежат исходники.

Чтобы та волшебная строчка заработала нужно написать неявное правило, которое будет генерировать цели для создания объектных файлов в каталоге obj из исходников в каталоге src (как сделать см. здесь). Оно будет следующим:
obj/%.o: src/%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<

Теперь собираем всю информацию воедино и делаем украшательства:
BINDIR=bin
OBJDIR=obj
SRCDIR=src

TARGET=$(BINDIR)/$(shell basename `pwd`)
SOURCES=$(wildcard $(SRCDIR)/*.cpp)
OBJECTS=$(SOURCES:$(SRCDIR)%.cpp=$(OBJDIR)%.o)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -o $@ $<

all: $(TARGET)

$(OBJECTS): $(SOURCES)

$(TARGET): $(OBJECTS)
$(CXX) -o $(TARGET) $(LDFLAGS) $(OBJECTS) $(LOADLIBES) $(LDLIBS)

clean:
$(RM) $(TARGET) $(OBJECTS)

.PHONY: all clean

 

Страница сгенерирована за 0.11 секунд. Запросов: 25.