2017-03-14 32 views
0

我使用cmake构建一个跨平台库,我的大多数项目都依赖于它。目录结构如下:如何使用共享库cmake处理标题

/ 
--headers 
--include 
--src 
--src_win 
--src_linux 

“include”目录中的头文件基本上包含“headers”目录中的其他头文件。因此,他们看起来比如像:现在

#include "../headers/header1.h" 
#include "../headers/header2.h" 
#include "../headers/header3.h" 

,以便使用从其他项目这个图书馆,我安装“包括”目录库中的文件。像这样:

install(FILES include/mylib1.h DESTINATION include) 
install(TARGETS mylib DESTINATION lib) 

很显然,在另一个项目中,我会#include subincludes不会找到标题。 我该如何正确处理这个问题?我的意思是我必须将“标题”目录中的所有文件复制到“/ usr/local/headers”,这并不是一个聪明的主意。我该如何处理? “安装”实际上是一个好主意吗? cmake可以记住库的位置(在我的home文件夹中的git仓库克隆中)? 通过我是从窗户进来的方式打造世界并习惯到Visual Studio

非常感谢您的帮助

+2

我觉得创建“标题”目录根本不好。 –

+0

关键是,根据我正在使用的操作系统,我具有某些功能的不同实现。这就是为什么我想分开标题的原因 – acensored

+1

'我根据操作系统有不同的特定功能的实现' - 标头文件通常包含**声明**,而不是*实现*(*定义*)。在任何情况下,您都应该**安装可以直接或间接包含的所有内容**。 'cmake可以记住图书馆所处的位置 - 安装文件是**断开连接**,无论是源文件还是构建文件,还是来自CMake。这是常见的做法。 – Tsyvarev

回答

0

什么Tsycarev的解释是,你的公共头文件不应该依赖于操作系统。创建库时,必须考虑库的用户应该使用哪些函数和类型。我们将这个函数,类型和类的子集称为库的公共API。

如果headers文件夹中的标题不应该是公共API的一部分,则用户不需要这些头文件。然后正确的解决方案是#include这些文件只在您的源文件中,而不在公用头文件中。

如果您的操作系统相关头文件中包含属于公共API的函数,则应重新考虑您的方法。如果你考虑过它,但仍然希望拥有一个依赖于操作系统的公共API(可能有其他原因,例如不同的字符串实现),那么你需要将这些头文件发布到库中。但是,您的图书馆也不会独立于平台,因为您的用户必须根据操作系统编写不同的程序。