g ++ include all / usr / include рекурсивно - PullRequest
11 голосов
/ 04 февраля 2009

Я пытаюсь скомпилировать простую программу, с

#include <gtkmm.h>

Путь к gtkmm.h равен /usr/include/gtkmm-2.4/gtkmm.h. g ++ не видит этот файл, если я специально не скажу ему -I /usr/include/gtkmm-2.4.

У меня вопрос, как я могу g ++ автоматически рекурсивно просматривать все каталоги в /usr/include для всех содержащихся в них заголовочных файлов, и почему это не действие по умолчанию?

Ответы [ 3 ]

16 голосов
/ 04 февраля 2009

В этом случае правильное решение - использовать pkg-config в вашем Makefile или buildscripts:

# Makefile
ifeq ($(shell pkg-config --modversion gtkmm-2.4),)
  $(error Package gtkmm-2.4 needed to compile)
endif

CXXFLAGS += `pkg-config --cflags gtkmm-2.4`
LDLIBS += `pkg-config --libs gtkmm-2.4`

BINS = program
program_OBJS = a.o b.o c.o

all: $(BINS)

program: $(program_OBJS)
        $(CXX) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@

# this part is actually optional, since it's covered by gmake's implicit rules
%.o: %.cc
        $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@

Если вы пропустите gtkmm-2.4, это даст

$ make
Package gtkmm-2.4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtkmm-2.4.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtkmm-2.4' found
Makefile:3: *** Package gtkmm-2.4 needed to compile.  Stop.

В противном случае вы получите все необходимые пути и библиотеки, не задавая их вручную. (Проверьте вывод pkg-config --cflags --libs gtkmm-2.4: это намного больше, чем вы хотите печатать вручную.)

2 голосов
/ 04 февраля 2009

Я полагаю, вы не используете make-файл? Единственное, что может раздражать, - это указывать параметр long -I каждый раз, когда вы компилируете. Makefile делает это намного проще.

Например, вы можете изменить файл hello world makefile из wikipedia на что-то вроде следующего:

INC=-I/usr/include/gtkmm-2.4/

helloworld: helloworld.o
    g++ -o $@ $<

helloworld.o: helloworld.c
    g++ $(INC) -c -o $@ $<

.PHONY: clean

clean:
    rm -f helloworld helloworld.o
1 голос
/ 04 февраля 2009

Вы не можете. Суть включаемых путей в том, что вы можете выбирать, что вы хотите и какие версии.

То, что вы могли бы сделать, это ..

#include <gtkmm-2.4/gtkmm.h>

Что бы достичь того же эффекта.

...