库包含具有相同标题名称的路径

时间:2011-03-02 13:40:04

标签: c++ include include-path

在其他包含目录的另一个文件夹中包含具有相同名称的文件的最佳方法是什么?

示例:

lib1/include/foo.h
lib2/include/foo.h

其中lib1 / include和lib2 / include都添加到其他包含目录中。

编辑:

libs来自不同的SDK,每个开发人员都在自己的位置安装它们。唯一可以确定的是两个文件夹都在IDE的附加包含路径中

方法1:

#include "../../lib1/include/foo.h

方法2:

在搜索路径中的lib2 / include之前添加lib1 / include,因为它们按顺序搜索:

#include "foo.h"

将包含lib1 / include / foo.h

5 个答案:

答案 0 :(得分:8)

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

只要这是这些标题的实际相对路径并且包含警卫不同,就可以了。例如,如果两个foo.h都使用

#ifndef _foo_h_

然后这会给你一些你不想要的东西(它只包括一个,而不是两个,哪个取决于执行的顺序)。

答案 1 :(得分:5)

你可以这样做:

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

并确保lib1lib2的父目录位于包含的搜索路径中(但实际的include子目录本身)

请注意,如果两个标题使用与包含保护相同的符号,则此方法将无效 - 您需要取消定义两者之间的冲突符号:

#include "lib1/include/foo.h"
#undef FOO_H
#include "lib2/include/foo.h"

答案 2 :(得分:4)

首先,这个答案假设两个标题的包含保护是兼容的(即不是相同的符号)。

您可以做的一件事是在已知位置创建感兴趣的头文件的链接,为链接本身提供不同的名称。例如,假设您的两个库安装在$ LIB1PATH和$ LIB2PATH,它们可能在不同的构建环境中具有不同的值。因此,您想要获取的标头位于$ LIB1PATH / include / foo.h和$ LIB2PATH / include / foo.h。

你可以用两种方式。一种是通过创建直接链接。这可能在项目的目录树中看起来像这样:

$PROJDIR/
    include/
    lib_include/
        lib1_foo.h -> $LIB1PATH/include/foo.h
        lib2_foo.h -> $LIB2PATH/include/foo.h
    src/

如果您的代码位于存储库中,这可能会变得棘手,因为您无法检查这些链接;他们在其他环境中是错的。此外,如果你有很多这些链接和很少的库,你必须重新创建所有这些,只要lib1或lib2移动...不酷。您可以通过在包含项目目录的目录中创建链接来解决此问题:

$PROJDIR/
    include/
    lib_include/
        lib1_foo.h -> ../../lib1/include/foo.h
        lib2_foo.h -> ../../lib2/include/foo.h
    src/
lib1 -> $LIB1PATH/
lib2 -> $LIB2PATH/

在这两种情况下,您都需要确保$PROJDIR/lib_include在您的包含路径中。此外,如果两个$LIB1PATH/include标头从这些目录中引入更多标头,则只需在包含路径中包含$LIB2PATH/includefoo.h。您也可以将链接放在include中并删除lib_include,但我喜欢将这些内容分开。

答案 3 :(得分:4)

我不知道目前有4个答案和1709个观点,但是没有人建议这么容易和直接的解决方案。

您可以根据需要添加文件,您遇到的唯一真正问题是相同的防护标头。因此,您必须创建一个包含冲突头文件的标头。我们称之为inc_foo_lib1_lib2.h。在此文件中,您包含第一个foo.h,如果定义了保护标头取消定义,则接下来包括第二个foo.h

例如,假设foo.h有一个标题保护FOO_H_INCLUDED,那么您的inc_foo_lib1_lib2.h就像:

#include "lib1/foo.h"
#ifdef FOO_H_INCLUDED
#undef FOO_H_INCLUDED
#else
COMPILATION ERROR — the header guard was changed!
#endif //FOO_H_INCLUDED
#include "lib2/foo.h"

答案 4 :(得分:1)

我将包含来自-I列表中的明确目录的文件(也就是说包含lib1和lib2的目录的路径):

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"

因此不存在歧义,因为预编译器将在其目录列表中查看lib1/include/foo.h,而不是lib1/include/lib2/include/,而是仅从父目录。< / p>

如前所述:小心守卫,即使是lib头,名称也应该包含lib名称以避免这种混淆。