13

我正在尝试编译一个简单的程序,

#include <gtkmm.h>

的路径gtkmm.h/usr/include/gtkmm-2.4/gtkmm.h。g++ 看不到这个文件,除非我特别告诉它-I /usr/include/gtkmm-2.4

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

4

3 回答 3

17

在这种情况下,正确的做法是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,这将产生

$ 制作
在 pkg-config 搜索路径中找不到包 gtkmm-2.4。
也许你应该添加包含 `gtkmm-2.4.pc' 的目录
到 PKG_CONFIG_PATH 环境变量
找不到包“gtkmm-2.4”
Makefile:3: *** 包 gtkmm-2.4 需要编译。停止。

否则,您将获得所有适当的路径和库,而无需手动指定它们。(检查pkg-config --cflags --libs gtkmm-2.4: 的输出,这远远超过您想要手动输入的内容。)

于 2009-02-04T05:17:49.063 回答
2

我猜你没有使用makefile?唯一可能令人讨厌的是每次编译程序时都必须输入 long -I 选项。makefile 使它变得容易得多。

例如,您可以将wikipedia中的hello world makefile修改为如下内容:

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
于 2009-02-04T05:02:41.123 回答
0

你不能。包含路径的全部意义在于您可以选择所需的内容和版本。

你能做的是..

#include <gtkmm-2.4/gtkmm.h>

这将达到相同的效果。

于 2009-02-04T04:53:11.017 回答