не получается сделать makefile

Тема в разделе "WASM.UNIX", создана пользователем FreeX, 14 дек 2009.

  1. FreeX

    FreeX New Member

    Публикаций:
    0
    Регистрация:
    19 май 2009
    Сообщения:
    13
    приветствую..

    В общем, не удается написать makefile, чтобы все объектники клались, допустим, в папку project/obj/, а не в туже папку, где лежат сорцы.
    Допустим такой вот makefile:

    OBJS=../obj/file1.o ../obj/file2.o ... ../obj/file10.o
    SRCS= file1.c file2.c ... file10.c
    TARGET=file.out

    all: $(TARGET)

    $(TARGET): $(OBJS)
    g++ -o $(TARGET) $(OBJS)

    и для каждого объектника приходится писать что-то типа:
    ../obj/file1.o:file1.c
    g++ -c -o $@ $^
    ...
    ...
    ../obj/file10.o:file10.c
    g++ -c -o $@ $^

    А можно как-нибудь создание этих объектников записать покомпактнее, т.е не писать для каждого отдельно команды компиляции?
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    http://www.gnu.org/software/make/manual/make.html#index-OUTPUT_005fOPTION-838
    Every rule that produces an object file uses the variable OUTPUT_OPTION. make defines this variable either to contain `-o $@', or to be empty, depending on a compile-time option. You need the `-o' option to ensure that the output goes into the right file when the source file is in a different directory, as when using VPATH (see Directory Search). However, compilers on some systems do not accept a `-o' switch for object files. If you use such a system, and use VPATH, some compilations will put their output in the wrong place. A possible workaround for this problem is to give OUTPUT_OPTION the value `; mv $*.o $@'.
     
  3. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Да.
    Я обычно пишу так:
    Код (Text):
    1. CXX=g++
    2. CXXFLAGS=-Wall -ggdb3
    3.  
    4. program: file1.o file2.o fileN.o
    5.         g++ -o $@ $^
    Этого достаточно, ибо make сам знает как из .c сделать .o:
    Код (Text):
    1. info make "Implicit Rules" "Catalogue of Rules"
    Хотя в ситуациях посложнее, всё же приходится явно писать зависимости, особенно зависимости от заголовков, то есть появляется куча строк вида:
    Код (Text):
    1. file1.o: file1.c file1.h common.h
    Но с этим можно бороться генерируя пререквизиты автоматически. И в info make где-то было про это. Там по-моему даже готовый скрипт есть.
     
  4. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Ах да, только сейчас обратил внимание. Тебе придётся переименовать все твои .c во что-нибудь более пристойное, типа .cpp, .cc, .c++, .cxx. то есть приделать расширения которое будет говорить make'у что твои файлы всёж содержат c++ код.
     
  5. abdulla_ali

    abdulla_ali New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2009
    Сообщения:
    5
    нет.


     
  6. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Ну на мой взгляд, всё же проще придерживаться стандартов в именовании файлов, чем каждый раз создавая Makefile переписывать стандартные правила зашитые в make.
     
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Вопрос внимательно перечитай! Ему нужно папку поменять для obj!
     
  8. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    valterg
    Эээ... Сам перечитай.
    Вопрос состоит из двух частей. Даже правильнее сказать, что просто ТС задал два вопроса. На первый ответили. Мне есть что добавить, но я не думаю что разговоры о генерации Makefile'ов скриптами тут уместны. Даже если это стандартные пути решения данной проблемы типа automake и autoconf. И, не считая необходимым развивать тему, я решил прояснить ситуацию со вторым вопросом. Получилось длинновато, в три поста (уже даже в четыре), но... Ты считаешь мне стоит принести общественности публичные извинения?
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    1) где ты видишь второй вопрос ?
    2) ТС больше не появлялся. Зачем тему поднимать и придумывать вопросы...
     
  10. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    valterg
    1. Вот он второй вопрос: "А можно как-нибудь создание этих объектников записать покомпактнее, т.е не писать для каждого отдельно команды компиляции?"
    2. Сейчас мы развиваем эту тему сверху, общаясь с тобой. А изначально, я дату кривовато посмотрел и ошибся на месяц.
    3. Я не столь нетерпим как ты, и если ты придумаешь ещё какие-нибудь вопросы мне, не стесняйся, задавай сразу же.