g ++包括所有/ usr / include递归

时间:2009-02-04 04:45:31

标签: c++ g++

我正在尝试使用

编译一个简单的程序
#include <gtkmm.h>

gtkmm.h的路径为/usr/include/gtkmm-2.4/gtkmm.h。除非我明确指出-I /usr/include/gtkmm-2.4,否则g ++不会看到此文件。

我的问题是,如何让g ++自动在/usr/include中的所有目录中递归查看其中包含的所有头文件,为什么这不是默认操作?

3 个答案:

答案 0 :(得分:16)

在这种情况下,正确的做法是在pkg-config或构建文件中使用Makefile

# 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的输出:这远远超过您想要手动输入的内容。)

答案 1 :(得分:2)

我猜你没有使用makefile?唯一令人烦恼的是每次键入你的程序时都需要输入long -I选项。 makefile使它变得更容易。

例如,您可以将{em> 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

答案 2 :(得分:1)

你做不到。包含路径的重点在于您可以选择所需的内容和版本。

你能做的是......

#include <gtkmm-2.4/gtkmm.h>

哪个会达到同样的效果。