每当我开始用C ++开发新的共享库时,我都会遇到同样的问题:
我是否应该使用相对于当前文件位置的包含或包含相对于(潜在)包含路径(-I
)来引用我项目中的其他头文件,即同一个库?
我检查了系统上安装的一些库头。
boost
似乎使用包含相对于包含路径和<>
括号的包含其他提升标题,即#include <boost/move/move.hpp>
poppler
似乎使用""
的一些奇怪的相对路径,有时相对于当前位置,有时相对于它的基础(我甚至不知道这是有效的),. eg在fofi/FoFiEncodings.h
中有一个#include "goo/gtypes.h"
,其中fofi
和goo
是同一级别的目录""
的文件及其位置相对路径,主要是同一目录中的文件它是否依赖于共享库本身的目录结构(即其复杂性),即位置相对路径适用于简单的布局,但是在boost
中有更多交叉引用的缺点?是否存在任何技术原因或陷阱,为什么一个人可能会工作但另一个人没有(可移植性,编译器依赖行为,......)?
答案 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"