Mir*_*pas 17 c++ include include-path
从其他包含目录中包含另一个文件夹中具有相同名称的文件的最佳方法是什么?
例:
lib1/include/foo.h
lib2/include/foo.hRun Code Online (Sandbox Code Playgroud)
其中lib1/include和lib2/include都添加到其他include目录中.
编辑:
这些库来自不同的SDK,每个开发人员都在自己的位置安装它们.唯一可以确定的是两个文件夹都在IDE的附加包含路径中
方法1:
#include "../../lib1/include/foo.h
方法2:
在lib2/include之前添加lib1/include在搜索路径中,因为它们按顺序搜索:
#include "foo.h"
将包含lib1/include/foo.h
#include "lib1/include/foo.h"
#include "lib2/include/foo.h"
Run Code Online (Sandbox Code Playgroud)
只要这是这些标题的实际相对路径并且包含保护不同,就可以了.例如,如果两个foo.h都使用
#ifndef _foo_h_
Run Code Online (Sandbox Code Playgroud)
然后这会给你一些你不想要的东西(它只包括一个,而不是两个,哪个取决于执行的顺序).
你可以这样做:
#include "lib1/include/foo.h"
#include "lib2/include/foo.h"
Run Code Online (Sandbox Code Playgroud)
并确保两者的父目录lib1,并lib2在你的搜索路径包括(但不是实际的include子目录本身).
请注意,如果两个标头使用相同的符号作为包含保护,则此方法将不起作用 - 您需要取消定义两个包含之间的冲突符号:
#include "lib1/include/foo.h"
#undef FOO_H
#include "lib2/include/foo.h"
Run Code Online (Sandbox Code Playgroud)
首先,此答案假定两个标头的包含保护符兼容(即,不同的符号)。
您可以做的一件事是在已知位置创建到感兴趣的头文件的链接,为链接本身指定不同的名称。例如,假设您的两个库安装在$ 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/
Run Code Online (Sandbox Code Playgroud)
如果您的代码位于存储库中,这可能会变得棘手,因为您无法检入这些链接;在其他环境中他们会错。另外,如果您有许多这样的链接和少量的库,那么每当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/
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都需要确保$PROJDIR/lib_include包含路径上。另外,如果两个标头从这些目录中拉入更多标头,则只需要在包含路径中具有$LIB1PATH/include和即可。您也可以放入链接并删除它们,但我喜欢将这些内容分开。$LIB2PATH/includefoo.hincludelib_include
| 归档时间: |
|
| 查看次数: |
8827 次 |
| 最近记录: |