在C和C ++中包含和链接文件

时间:2012-09-03 18:41:34

标签: c++ c linker

  

可能重复:
  How do I add a directory to C header include path?

我已多次遇到这个问题,我认为从经验丰富的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语句:

#include <mylib2/mylib.h>

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

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

3 个答案:

答案 0 :(得分:3)

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

请注意,通常标题包含使用

来自同一包的相关文件
#include "another.h"

语法,因此首先在相对于安装位置的位置搜索它。如果您的图书馆已经这样做了,那么

就没有问题
#include <mylib2/mylib/mylib.h>

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

答案 1 :(得分: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 .....

您可以指定标题的搜索路径。

答案 2 :(得分:1)

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

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

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

和#include“mylib / mylib.h”无处不在

此外,这不是你问题的一部分,但我认为无论如何我会把它扔进去,但是带引号的include语句和尖括号之间有一点点差别: http://msdn.microsoft.com/en-us/library/36k2cdd4(v=vs.80).aspx