17

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

例子:

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

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

编辑:

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

方法一:

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

方法2:

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

#include "foo.h"

lib1/include/foo.h 将被包括在内

4

5 回答 5

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

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

#ifndef _foo_h_

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

于 2011-03-02T13:48:32.343 回答
5

你可以这样做:

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

lib1并确保两者的父目录lib2都在您的搜索路径中(但不是实际的include子目录本身)。

请注意,如果两个标头都使用相同的符号作为包含保护,则此方法将不起作用 - 您需要取消定义两个包含之间的冲突符号:

#include "lib1/include/foo.h"
#undef FOO_H
#include "lib2/include/foo.h"
于 2011-03-02T13:45:50.887 回答
5

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

您可以做的一件事是在已知位置创建指向感兴趣的头文件的链接,为链接本身赋予不同的名称。例如,假设您的两个库安装在 $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.hincludelib_include

于 2011-03-02T16:57:23.263 回答
4

我想知道目前有 4 个答案和 1709 个视图,还没有人建议这样一个简单直接的解决方案。

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

举个例子,假设foo.h有一个 header guard 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"
于 2014-08-26T07:52:49.577 回答
2

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

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

因此不会有歧义,因为预编译器将lib1/include/foo.h在其目录列表中查看,并且不会从父目录发生lib1/include/lib2/include/仅从父目录发生。

如前所述:注意守卫,即使对于 lib 标头,名称也应包含 lib 名称以避免此类混淆。

于 2011-03-02T14:22:32.303 回答