我正在尝试编译一个简单的程序,
#include <gtkmm.h>
的路径gtkmm.h
是/usr/include/gtkmm-2.4/gtkmm.h
。g++ 看不到这个文件,除非我特别告诉它-I /usr/include/gtkmm-2.4
。
我的问题是,我怎样才能让 g++ 自动递归地查看所有目录中/usr/include
包含的所有头文件,为什么这不是默认操作?
在这种情况下,正确的做法是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
: 的输出,这远远超过您想要手动输入的内容。)
我猜你没有使用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
你不能。包含路径的全部意义在于您可以选择所需的内容和版本。
你能做的是..
#include <gtkmm-2.4/gtkmm.h>
这将达到相同的效果。