使用cmake创建共享库时如何处理头文件

使用cmake创建共享库时如何处理头文件,cmake,shared-libraries,Cmake,Shared Libraries,我使用cmake构建了一个跨平台库,这是我的大多数项目所依赖的。目录结构如下: / --headers --include --src --src_win --src_linux “include”目录中的头文件基本上包括“headers”目录中的其他头文件。例如,它们看起来是这样的: #include "../headers/header1.h" #include "../headers/header2.h" #include "../headers/header3.h" 现在,为了从其他

我使用cmake构建了一个跨平台库,这是我的大多数项目所依赖的。目录结构如下:

/
--headers
--include
--src
--src_win
--src_linux
“include”目录中的头文件基本上包括“headers”目录中的其他头文件。例如,它们看起来是这样的:

#include "../headers/header1.h"
#include "../headers/header2.h"
#include "../headers/header3.h"
现在,为了从其他项目中使用这个库,我将文件安装在“include”目录和库中。就像这样:

install(FILES include/mylib1.h DESTINATION include)
install(TARGETS mylib DESTINATION lib)
显然,当我在另一个项目中包含子包含时,将找不到标题。 我怎样才能正确处理这个问题?我的意思是,我必须将“headers”目录中的所有文件复制到“/usr/local/headers”,这并不是一个明智的想法。我该怎么办?“安装”真的是个好主意吗?cmake还记得库的位置吗(在我的主文件夹中的git存储库克隆中)? 顺便说一下,我来自Windows构建世界,已经习惯了Visual Studio


非常感谢您的帮助

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

如果
headers
文件夹中的头不应该是公共API的一部分,则用户不需要这些头文件。正确的解决方案是将文件只包含在源文件中,而不包含在公共头文件中


如果在依赖操作系统的头文件中有函数是公共API的一部分,那么应该重新考虑您的方法。如果您考虑过这个问题,但仍然希望拥有一个依赖于操作系统的公共API(这可能是有原因的,例如不同的字符串实现),那么您需要随库提供这些头文件。但是,您的库也不会是独立于平台的,因为您的用户必须根据操作系统编写不同的程序。

我觉得创建“headers”目录是一种糟糕的做法。关键是,我对某些函数有不同的实现,这取决于我使用的操作系统。这就是为什么我希望将头文件分开的原因。
根据操作系统的不同,我对某些函数有不同的实现。
-头文件通常包含声明,而不是实现(定义)。在任何情况下,您都应该安装用户可以直接或间接包含的所有内容
cmake能否记住库的位置
-安装文件与源代码和生成文件以及cmake都断开连接。这是惯例。好吧,也许我有点不清楚。我在头文件中有一些声明
void someFunc()并根据我所在的操作系统使用不同的实现。这就是为什么我将头与源分开(请参见项目目录结构)。因此,安装似乎是正确的选择。这也是Windows上的常见做法吗?