首选位置相对或包含路径路径相对包含在您自己的库中的C ++中

时间:2018-01-09 08:16:17

标签: c++ shared-libraries

每当我开始用C ++开发新的共享库时,我都会遇到同样的问题:

我是否应该使用相对于当前文件位置的包含或包含相对于(潜在)包含路径(-I)来引用我项目中的其他头文件,即同一个库?

我检查了系统上安装的一些库头。

  • boost似乎使用包含相对于包含路径和<>括号的包含其他提升标题,即#include <boost/move/move.hpp>
  • 另一方面,
  • poppler似乎使用""的一些奇怪的相对路径,有时相对于当前位置,有时相对于它的基础(我甚至不知道这是有效的),. eg在fofi/FoFiEncodings.h中有一个#include "goo/gtypes.h",其中fofigoo是同一级别的目录
  • 许多其他人只是包含""的文件及其位置相对路径,主要是同一目录中的文件

它是否依赖于共享库本身的目录结构(即其复杂性),即位置相对路径适用于简单的布局,但是在boost中有更多交叉引用的缺点?是否存在任何技术原因或陷阱,为什么一个人可能会工作但另一个人没有(可移植性,编译器依赖行为,......)?

2 个答案:

答案 0 :(得分:0)

Boost使用括号而不是引号。这意味着它不是绝对路径,而是相对于提供给编译器的linclude目录列表开始搜索。所以它是相对路径的变体。

真正的绝对路径是一个坏主意,因为如果另一个开发人员在其他位置安装源代码,他/她将无法编译,除非他/她更改源中的所有标头引用。

修改

如果您开发的库足够通用并且可以在多个(可能不相关的)项目之间共享,那么括号选项应该是首选的。这使您可以自由地在任何地方安装库,并且可以非常轻松地切换库(不同项目的不同版本)。

如果您在更大的解决方案的上下文中开发更具体的库,主要是为了隔离可重用的代码,引用的相对路径是一个选项。如果以后要在其他上下文中重用该库,则必须在新解决方案目录中安装其源,以便相对路径仍然有效。因此,用例略有不同(在非常具体的项目环境中进行简单共享和偶尔重用)。

答案 1 :(得分:0)

在您的源文件中,执行您想要/喜欢的任何内容。

对于公共标题,相对路径是首选方式,因为用户可能会将标题放在特定位置并使用不完全相同的include指令。

我的意思是,假设你的等级是:

lib/headers/sub1/h1.h
lib/headers/sub2/h2.h
lib/headers/lib.h
lib/src/..

使用指令设置包含lib的路径, 用户应该#include <headers/lib.h>,但您的lib.h应该是:

#include "headers/sub1/h1.h"
#include "headers/sub2/h2.h"

sub1/h1.h

#include "headers/sub2/h2.h"

使用指令设置包含lib/headers的路径,

用户应该#include <lib.h>,但是lib.h应该是这样的:

#include "sub1/h1.h"
#include "sub2/h2.h"

sub1/h1.h

#include "sub2/h2.h"

因此,根据用户设置的指令,您的代码将无法为用户编译。

使用相对路径,对于上述两个指令,您的文件将相同

lib.h

#include "sub1/h1.h"
#include "sub2/h2.h"

sub1/h1.h

#include "../sub2/h2.h"