在C+;中您自己的库中更喜欢相对位置或相对包含路径+; 当我开始在C++中开发一个新的共享库时,我遇到了同样的问题:

在C+;中您自己的库中更喜欢相对位置或相对包含路径+; 当我开始在C++中开发一个新的共享库时,我遇到了同样的问题:,c++,shared-libraries,C++,Shared Libraries,我应该使用相对于当前文件位置的包含还是相对于(潜在)包含路径(-I)的包含来引用项目中的其他头文件,即相同的库 我检查了系统上安装的一些库标题 boost似乎使用相对于include路径的include和括号来包括其他boost头,即#include 另一方面,poppler似乎使用了一些奇怪的相对路径与“,有时是相对于当前位置,有时是相对于其基础(我甚至不知道这是可行的)。在fofi/FoFiEncodings.h中有一个#include“goo/gtypes.h”,其中fofi和goo是同

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

我检查了系统上安装的一些库标题

  • boost
    似乎使用相对于include路径的include和
    括号来包括其他boost头,即
    #include
  • 另一方面,
    poppler
    似乎使用了一些奇怪的相对路径与
    ,有时是相对于当前位置,有时是相对于其基础(我甚至不知道这是可行的)。在
    fofi/FoFiEncodings.h
    中有一个
    #include“goo/gtypes.h”
    ,其中
    fofi
    goo
    是同一级别的目录
  • 许多其他文件只是包含带有
    及其位置相对路径的文件,主要是同一目录中的文件

它是否取决于共享库本身的目录结构(即其复杂性),即位置相对路径在简单布局下运行良好,但在
boost
中存在更多交叉引用的缺点?有没有技术上的原因或陷阱,为什么一个可以工作,而另一个不行(可移植性、编译器依赖行为等等)

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

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

编辑:

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


如果您在一个更大的解决方案的上下文中开发一个更具体的库,主要是为了隔离可重用代码,那么引用的相对路径是一个选项。如果以后要在另一个上下文中重用该库,则必须将其源代码安装在newsolutions目录中,以便相对路径仍然有效。因此,用例有点不同(在非常特定的项目上下文中,狭窄的共享和偶尔的重用)。

在源文件中,做任何你想要/喜欢的事情

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

我的意思是,假设您的层次结构是:

lib/headers/sub1/h1.h
lib/headers/sub2/h2.h
lib/headers/lib.h
lib/src/..
通过指令将包含路径设置为
lib
, 用户应该执行
#include
,但是您的
lib.h
应该如下所示:

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

#include "headers/sub2/h2.h"
#include "sub2/h2.h"
#include "../sub2/h2.h"
通过指令将包含路径设置为
lib/headers

用户应该执行
#include
,但是您的
lib.h
应该如下所示:

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

#include "headers/sub2/h2.h"
#include "sub2/h2.h"
#include "../sub2/h2.h"
所以,根据用户设置的指令,您的代码不会为用户编译

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

lib.h

sub1/h1.h
to

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

“绝对”是指绝对路径吗?或者你只是指引用的#include“VS括号#include表单?请注意,严格来说,这两个问题的路径解释都是由实现定义的,大多数(所有?)编译器都会为它们提供设置,让它们按照您的喜好行事。我编辑了这个问题,以便更好地反映我的意思。。。当然,我不应该使用术语“绝对路径”,因为我只是指“相对于某种包含路径”,而不是“相对于当前文件的位置”。我的错误。我意识到我正确解释这个问题的错误。当然,我知道真正的绝对路径是个坏主意。我指的是“相对于当前文件位置”与。“相对于某种包含路径。谢谢。但是,如果某个文件Foo.h在同一个库中使用了Bar.h提供的其他功能,那么我更关注的是同一个库中的include。在库标题中,您应该保持一致。理论上,您可以使用括号并切换到未分发给库用户的内部标题中的引号,但边界有时会移动,因此不建议这样做。在cpp代码中,混合的风险较小,但我仍然会保持一致。