Направете чувствителност на файла към дефинициите на предпроцесора

Написах make файл.

В make файла използвах променлива, да кажем EXTRAFLAGS, която изглежда така.

EXTRAFLAGS += -D _MSC_VER
EXTRAFLAGS += -D BINARYINPUT
EXTRAFLAGS += -D ENABLEVERSION2D2

Освен това използвам флагове на компилатора

CFLAGS = -Werror -Wall -I $(INC) $(EXTRAFLAGS)

и

mingw32-gcc $(CFLAGS) -o nameofexe  OBJ's 

Използвах този makefile без никакви проблеми. Но когато деактивирам дефинициите на препроцесора, като въведа '#' пред един от операторите в EXTRAFLAGS и го преработя, получавам целта актуална. Не мога да въведа дефиниции на препроцесора в чувствителния списък.

Временна работа, която използвам в момента, е въвеждане на фалшива цел и премахване на всички обектни файлове и повторно компилиране на всичко. Но това е загуба на време. Как мога да управлявам по-добре текущия сценарий?


person Ram    schedule 28.11.2011    source източник
comment
Искате да кажете, че ако промените EXTRAFLAGS файловете не се създават отново?   -  person Some programmer dude    schedule 28.11.2011
comment

Здравейте, имам проблем с реферирането на произхода на JPanel в моя JFrame. Моят JPanel беше настроен така, че в конструктора искам да добавя линия, която е в левия край на моя JPanel.

table = new JPanel();                    
table.setBackground(Color.green);                   
table.setBounds(10,10, 600, 600);
table.setSize(width.getValue(), height.getValue());
add(table);                                     

След това методът на боядисване...

public void paint(Graphics g){
    super.paint(g);
    Graphics2D g2d = (Graphics2D)g;
    g2d.drawLine(table.getX(), table.getY(), table.getX(), (table.getY() + table.getHeight()));
    g2d.drawLine(100, 100, (int)Math.round(cueBall.getPositionX()), (int)Math.round(cueBall.getPositionY()));   
}

Последната команда в метода за рисуване не е свързана с моя проблем... Кодът изглежда получава произхода като (10, 10), но го прилага към JFrame като цяло, а не към contentPane. Не разбирам напълно contentPane, но си помислих, че add() добавя към панела със съдържание и оттогава нататък вие препращате към координати само от contentPane... Просто не виждам защо setBounds() добави JPanel, където аз исках го, което беше (10,10) по отношение само на contentPane, но когато рисувам() изглежда, че получавам координатите по отношение на contentPane, но рисувам тези координати по отношение на JFrame. Осъзнавам, че мога просто да добавя стойност, за да преместя реда надолу, но подозирам, че това е лошо решение.

Трябва ли да добавя contentPane с негов собствен метод paint() или нещо подобно?

  -  person Ram    schedule 28.11.2011


Отговори (2)


Make е инструмент, който компилира вашия проект нов, когато един от вашите файлове в проекта се промени.

напр. когато промените вашия .h файл, той разпознава промяната и възстановява всички файлове, които зависят от него, и след това възстановява всичко, което зависи от новите компилации, ...

Но когато промените флаговете на компилатора и/или дефинициите в makefile, входните файлове на проекта не се променят, така че проектът не се изгражда отново.

Има три начина да постигнете това, което искате: Първо издайте ръчно make clean след промяна на make-файла. Второ, за да включите самия makefile във вашия makefile (и да издадете make clean, когато се промени). И накрая преместете дефинициите в някакъв специфичен за проекта .h файл.

Като цяло само решението "in-a-h-file-on-its-own" е единственото, което избягва изграждането на всичко ново, тъй като другите не са наясно кои изходни файлове всъщност имат препратка към променените дефиниции.

person flolo    schedule 28.11.2011
comment
Първият начин е това, което правя в момента. Третото е това, което не искам да правя, защото изобщо не искам потребителите да докосват източника. Нека авторът на източника се тревожи за това. Добавих името на моя makefile към списъка за чувствителност заедно с моите обектни файлове. Това разрешава проблема. Дали вторият начин, който сте посочили, е това, което направих, или е нещо различно? - person Ram; 30.11.2011
comment
@ram: да, точно това е вторият начин. - person flolo; 30.11.2011

Не сте направили вашия .o файл зависим от Makefile в самия makefile.

Когато коментирате неща в/извън в Makefile, вие не променяте нищо, от което зависи .o файла - за разлика от това, когато редактирате .c файла

Можете да поправите това просто като създадете зависимост на вашия .o или .c файл, за да включите самия Makefile, и когато актуализирате нещо във вашия Makefile, целият ви източник ще се прекомпилира.

Например;

  SRC=a.c b.c
  OBJS=a.o b.o
  EXE=ab

  $(EXE): $(OBJS)
       gcc -o $(EXE) $(OBJS) $(...anything-else...)

  $(OBJS): $(SRC) Makefile

(Сега има по-добри начини за генериране на списъците .c и .o, но горното трябва да е достатъчно за този пример)

person Soren    schedule 28.11.2011
comment
да Точно това трябваше да направя. Въведете makefile в списъка за чувствителност заедно с obj файловете. Благодаря за помощта. - person Ram; 30.11.2011