【问题标题】:g++ include all /usr/include recursivelyg++ 递归包含所有 /usr/include
【发布时间】:2010-10-05 08:05:08
【问题描述】:

我正在尝试用

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

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

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

【问题讨论】:

标签: c++ g++


【解决方案1】:

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

你能做的是..

#include <gtkmm-2.4/gtkmm.h>

这会达到同样的效果。

【讨论】:

  • 问题在于 gtkmm.h 本身只包含一堆其他头文件,其路径相对于其位置,g++ 无法找到 .. :/。这很烦人。我想我可以遍历并替换 gtkmm.h 中的所有路径,但我希望有另一种解决方案。
  • @endeavormac: 相对包含在 gtkmm.h 中的形式是什么?基本上,您应该指定通过 -I 找到 gtkmm.h 的目录,然后它很可能会正常工作。没有它,它不会。句号 - 或句号,如果您愿意的话。为什么要对抗设计?
【解决方案2】:

我猜你没有使用makefile?唯一可能令人烦恼的是,每次编译程序时都必须输入长 -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

【讨论】:

    【解决方案3】:

    在这种情况下,正确的做法是在您的 Makefile 或 buildscripts 中使用 pkg-config

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

    【讨论】:

    • 我想我刚刚打开了一个全新的头痛让我阅读。好的,谢谢
    猜你喜欢
    • 2013-12-27
    • 2014-10-19
    • 2020-10-27
    • 2021-01-12
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多