0

可能重复:
如何将目录添加到 C 标头包含路径?

我已经多次遇到这个问题,我认为最好从有经验的 C 或 C++ 程序员那里得到解释。在下面的示例中,我使用了示例库名称,但实际名称可以是任何名称。

假设我想运行以下 MWE:

#include <stdio.h>
#include <mylib/mylib.h> /* Also try mylib2/mylib/mylib.h */

int main (int argc, char **argv) {
    printf ("Hello, World!\n");
    return 0;
}

此外,假设我有一个 Linux 发行版,而不是放在mylib.h中,而是/usr/include/mylib/选择目录/usr/include/mylib2/mylib/。所以简单的命令:

$ gcc test.c

会因错误而失败:

fatal error: mylib.h: No such file or directory

但我可能会尝试通过编写以下内容来修复包含语句:

#include <mylib2/mylib.h>

这让我克服了第一个错误。但在内部,mylib.h以“通常”的方式引用其他头文件: #include <mylib/anotherheader.h>. 所以现在,即使我已经修复了 MWE 中的原始包含语句,#include <mylib2/mylib/mylib.h>因为构建中断,因为mylib.h它试图包含#include <mylib/anotherheader.h>而不是#include <mylib2/mylib/anotherheader.h>.

解决这个问题的标准方法是什么?必须有一个我缺少的简单编译标志。先感谢您。

4

3 回答 3

3

您设置包含路径,使其包含/usr/include/mylib2,通常与编译器类似的命令行选项-I/usr/include/mylib2

请注意,通常标头包含来自同一包的相关文件,使用

#include "another.h"

语法,以便首先在相对于它的安装位置进行搜索。如果您的图书馆已经这样做了,那么就没有问题了

#include <mylib2/mylib/mylib.h>

但即使是这种情况,您也不希望您的代码依赖于您使用的库的安装位置。这种依赖关系应该保留在构建系统中。

于 2012-09-03T18:47:23.963 回答
1

我会推荐以下模式:

/usr/libs/lib15 - 是您的库所在的目录。

在代码中:

#include <stdio.h>
#include <mylib1.h>            // Header from your lib.
#include <mylib2.h>            // Other header from your lib.
#include <mygraphs/defines.h>  // Headers in your lib have even subdirectories.

在命令行中:

cl -I /usr/libs/lib15 .....

您指定标题的搜索路径。

于 2012-09-03T18:46:28.373 回答
1

请参阅 gcc 和 g++ 上的 -I 编译器标志,它允许您指定其他包含路径:

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

在这种情况下,您可以指定: -I /usr/include/mylib2

和 #include "mylib/mylib.h" 无处不在

另外,这不是您的问题的一部分,但我想我还是会把它扔在那里,但是带引号的包含语句和尖括号之间存在细微差别:http: //msdn.microsoft.com/en-us/库/36k2cdd4(v=vs.80).aspx

于 2012-09-03T18:47:18.040 回答