C++ 库包含具有相同头名称的路径

C++ 库包含具有相同头名称的路径,c++,include,include-path,C++,Include,Include Path,在其他包含目录的另一个文件夹中包含同名文件的最佳方法是什么 例如: lib1/include/foo.h lib2/include/foo.h 其中lib1/include和lib2/include都添加到其他include目录中 编辑: lib来自不同的SDK,每个开发人员都在自己的地方安装它们。唯一可以确定的是,这两个文件夹都在IDE的附加包含路径中 方法1: #include./../lib1/include/foo.h 方法2: 在搜索路径中的lib2/include之前添加lib1/i

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

例如:

lib1/include/foo.h
lib2/include/foo.h
其中lib1/include和lib2/include都添加到其他include目录中

编辑:


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

方法1:

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

方法2:

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

#包括“foo.h”

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

您可以这样做:

#include "lib1/include/foo.h"
#include "lib2/include/foo.h"
并确保
lib1
lib2
的父目录都在include的搜索路径中(但不是实际的
include
子目录本身)

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

#include "lib1/include/foo.h"
#undef FOO_H
#include "lib2/include/foo.h"
只要这是到这些头的实际相对路径,并且包含的防护装置不同,就可以了。例如,如果两个foo.h都使用

#ifndef _foo_h_

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

我将包括
-I
列表中明确目录中的文件(即包含lib1和lib2的目录的路径):

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


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

首先,此答案假设两个头的include防护兼容(即符号不同)

您可以做的一件事是在已知位置创建指向感兴趣的头文件的链接,并为链接本身指定不同的名称。例如,假设您的两个库安装在$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移动时,您都必须重新创建所有这些链接……这不太酷。您可以通过在包含这些链接的目录中创建链接来解决此问题t获取项目的目录:

$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
在您的include路径上。此外,如果这两个
foo.h
头从这些目录中引入了更多头,那么您只需要在include路径中包含
$LIB1PATH/include
$LIB2PATH/include
。您还可以将链接放入
include
去掉lib_include,但我喜欢把这些东西分开。

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

您可以根据需要包括这些文件,但您将遇到的唯一真正问题是关于相同的保护头。因此,您必须创建一个包含两个冲突头文件的头文件。我们将其称为
inc\u foo lib1\u lib2.h
。在此文件中,您包括第一个
foo.h
,如果保护头是def定义未定义,然后包括第二个
foo.h

例如,假设
foo.h
包含一个标题保护
foo\u h\u
,则您的
inc\u foo\u lib1\u 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"

lib来自不同的SDK,每个开发人员都在自己的地方安装它们。唯一可以确定的是,这两个文件夹都在IDE的附加include中paths@Felics:这就是为什么你必须避免
#包括“foo.h”
。你是说SDK安装在哪些目录中(
lib1
lib2
在本例中)不确定?如果是这样,您唯一的解决方案是创建指向两个头文件的具有不同名称的链接,并使用这些链接访问头文件。由于eznme提到的include guard问题,即使这样也可能不起作用。为什么要进行匿名否决投票?如果否决投票人有有效的批评,请随意发表,我会很高兴地修改我的评论回答或删除它。@Mike请添加您的评论作为回答,因为这是一个更好的方法(在我看来)对于这个问题。有几个有用的答案总是好的,即使建议中有一些重叠。无论如何,我会给你的答案投赞成票。方法2不好,因为程序编译依赖于设置(包括目录顺序)不是在代码本身。如果有人必须重建项目设置,这个问题甚至不会出现,更不用说正确的设置是什么了。@Mike我知道这些不是最好的方法,但是我现在想到的唯一方法。因为我不喜欢这些方法中的任何一种,所以我在这里要求更好的方法。谢谢非常感谢,先生,还有你:关于搜索路径的观点很好!
$PROJDIR/
    include/
    lib_include/
        lib1_foo.h -> ../../lib1/include/foo.h
        lib2_foo.h -> ../../lib2/include/foo.h
    src/
lib1 -> $LIB1PATH/
lib2 -> $LIB2PATH/
#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"