2013-12-08 1 views
1

Я читаю «Основы GTK +» и при этом решил написать простой make-файл, который позволил бы мне запустить «make» для компиляции примерной программы, которую я только что написал. Я также наткнулся на список директив компилятора here, который указанная команда Gnome поможет перейти с GTK2 на GTK3, поэтому я хотел включить их.дополнительные CFLAG с Makefile

Я заставлю нуб для всех намерений и целей, так это то, что я придумал:

CC   = gcc 
CFLAGS  += -Wall 
GTK_DFLAGS = -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE 
GTK_CFLAGS = $(shell pkg-config --cflags gtk+-3.0) 
GTK_LDFLAGS = $(shell pkg-config --libs gtk+-3.0) 

%.o: %.c 
    $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) -c -o [email protected] $< 

%: %.o 
    $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) $(GTK_LDFLAGS) -o [email protected] $< 

.PHONY: clean 

clean: 
    rm -f *.o *~ 

И как вы можете догадаться, это не работает достаточно хорошо. Я знаю, что запуск pkg-config изнутри make-файла не является идеальным решением, но это для моих небольших проектов обучения, а не для развертывания любого типа. Тем не менее, выход мне странный; кажется, что просто игнорирует любые переменные после CFLAGS.

Что-то вроде:

[[email protected] ch2]$ make helloworld 
gcc -Wall helloworld.c -o helloworld 
helloworld.c:1:21: fatal error: gtk/gtk.h: No such file or directory 
#include <gtk/gtk.h> 
        ^
compilation terminated. 
<builtin>: recipe for target 'helloworld' failed 
make: *** [helloworld] Error 1 

Если добавить есть содержимое GTK_DFLAGS просто пришитые к концу CFLAGS, они появляются в командной строке, но переменные PKG-конфигурации по-прежнему отсутствует.

Для меня очевидно, что я испортил что-то простое, но через час смутно сформулированного Googling, я свеж от идей относительно того, что это такое.

+0

Кроме того, я был бы счастлив иметь что-нибудь _else_ Я делаю неправильно указано. =) – musasabi

+1

Я не вижу никаких явных ошибок с головы. Я бы рекомендовал использовать ': =' вместо '=' в строках с '$ (shell ...)'. Ошибка в этом случае приводит только к дополнительным вызовам 'pkg-config', что является проблемой только во время' make'. Не главная причина того, что вызывает эту проблему. –

+0

Ага ... Я вижу, что происходит. Ваша главная цель - «helloworld», и вы ее компилируете непосредственно из файла 'helloworld.c', а не связываете файл' helloworld.o'. Какова ваша цель «helloworld»? –

ответ

0

Вам нужна цель для helloworld в вашем файле Makefile. Что-то вроде этого:

helloworld: helloworld.o 
    $(CC) -o helloworld helloworld.o $(LDFLAGS) $(GTK_LDFLAGS) 
+1

Но если я просто хочу сделать, чтобы построить все, что я ему предоставляю? Например, «make helloworld» компилирует helloworld.c с предоставленными директивами, но «make foo» скомпилирует foo.c с теми же директивами. – musasabi

+0

Если ваш исполняемый файл может быть создан только из одного исходного файла, то похоже, что ваше '%:% .o' правило должно его покрывать. Моя память здесь нечеткая, но я считаю, что эти правила шаблонов требуют суффикса с обеих сторон, и это то, чего не хватает правилу. –

+1

Да, я решил. Я ошибся в своем понимании макросов. См. Мой ответ ниже. =) – musasabi

1

Нашел ответ, и, конечно, словарь, который мне не хватало, когда задавал этот вопрос/делал более ранние поиски.

CC   = gcc 
CFLAGS  += -Wall -std=c11 
GTK_DFLAGS = -DGTK_DISABLE_SINGLE_INCLUDES -DGDK_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGSEAL_ENABLE 
GTK_CFLAGS := $(shell pkg-config --cflags gtk+-3.0) 
GTK_LDFLAGS := $(shell pkg-config --libs gtk+-3.0) 

%: %.c 
    $(CC) $(CFLAGS) $(GTK_DFLAGS) $(GTK_CFLAGS) $(GTK_LDFLAGS) -o $* $*.c 

.PHONY: clean 

clean: 
    rm -f *~ 

Это делает то, что я хочу, что компилировать один .c файл любого имени в программу того же имени с флагами GTK я искал использовать.

Спасибо тем, кто внес свой вклад!

+1

Вы должны написать правило как '%:% .c'. Если вы не даете предварительных условий, то make не будет перестраивать вашу программу при изменении исходного файла, что делает его бесполезным для использования make-файла в первую очередь. – MadScientist

+1

Ах, конечно! Я сделал это изменение в своем make-файле после того, как make сказал мне, что цель обновлена, но я забыл внести изменения здесь. Делать это! знак равно – musasabi

Смежные вопросы