g ++编译器选项使用`pkg-config ...`导致-I(目录)-I是什么意思?

时间:2014-07-30 04:44:15

标签: c++ linux

我熟悉编译和链接程序的非常简单的g ++命令,但是在使用GTK +时我发现教程表明我应该使用pkg-config --cflags gtk+-2.0

现在当我在终端输入pkg-config --cflags gtk+-2.0时,我得到一个像这样的库和文件列表......

-pthread -I / usr / include / gtk-2.0 -I / usr / lib / x86_64-linux-gnu / gtk-2.0 / include -I / usr / include / atk-1.0 -I / usr / include / cairo -I / usr / include / gdk-pixbuf-2.0 -I / usr / include / pango-1.0 -I / usr / include / gio-unix-2.0 / -I / usr / include / glib-2.0 -I / usr /lib/x86_64-linux-gnu/glib-2.0/include -I / usr / include / pixman-1 -I / usr / include / freetype2 -I / usr / include / libpng12 -I / usr / include / harfbuzz

所以我的问题是, -I 在目录前面是什么意思?例如-I/usr/include/libpng12

4 个答案:

答案 0 :(得分:2)

-I标志用于将目录添加到目录列表中,以搜索#include <>语句中的查找文件。

在您的情况下,当使用#include包含文件时,/usr/include/libpng12将成为预处理器搜索文件的目录之一。

答案 1 :(得分:2)

请阅读手册。所有命令行选项都存在于: - )

- 我设置了库的搜索路径。

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

答案 2 :(得分:2)

-I只是添加要搜索头文件的路径。请注意,在系统路径之前搜索这些内容。

您可以找到gcc/g++ here的几乎所有选项。在这种情况下,您需要具体的目录搜索选项;见here。从该页面:

  

-Idir

     

将目录dir添加到目录列表的头部   搜索头文件。这可以用于覆盖系统   头文件,替换您自己的版本,因为这些目录   在系统头文件目录之前搜索。但是,你   不应使用此选项添加包含的目录   供应商提供的系统头文件(使用--isystem)。

     

如果您使用多个-I选项,则会扫描目录   从左到右的顺序;标准系统目录之后。如果一个   标准系统包括目录或指定的目录   -isystem也使用-I指定,忽略-I选项。仍然搜索该目录,但作为正常的系统目录   系统中的位置包括链。这是为了确保GCC的   程序来修复错误的系统标题和订单   include_next指令不会无意中更改。如果你真的   需要更改系统目录的搜索顺序,使用   -nostdinc和/或-isystem选项。

答案 3 :(得分:0)

正如@R Sahu @Klaus和@Yuushi的回答所解释的,-I dir告诉编译器在哪里寻找#include header.h文件。 程序编译后,将被链接。您可能还需要告诉链接器在哪里可以找到支持#included标头中的功能的程序。这是通过-llibrary标志完成的。这是一个小写字母l,而不是一(1)。 pkg-config命令引用了一组文件,如果提供了软件包名称,将提供编译器标志--cflags和链接标志--ldflags

在您的编译命令请求中,将返回的-包括在源名称之前,并将-l放在之后。

对于非一次性的一次性程序,应使用make。可以将cflag和ldflag信息放入Makefile中的变量中,并在整个make脚本中进行引用。

您可以使用locate *.pc

获取在Ubuntu系统上配置为pkg-config的软件包的完整列表。