【问题标题】:How to make header files can be include via Library name?如何使头文件可以通过库名称包含?
【发布时间】:2019-01-15 09:48:30
【问题描述】:

我正在尝试在 https://github.com/haithngn/cryptor 上用 C++ 创建一个跨平台的加密库,类似于 https://github.com/MailCore/mailcore2

结构是:

我可以让任何头文件包含在这样的语句中吗:

#include <Cryptor/MD5Encryptor.h>

我可以直接从绝对文件路径中包含这些头文件

../core/CryptorCore.h

但是这些格式会使源代码无法在 XCode 项目中构建成功。

我尝试模拟 MailCore2,但这非常困难。

希望您能建议我任何解决方案或在我的存储库上帮我 PR。

谢谢,

【问题讨论】:

  • 为什么你不能改变你的开发目录结构来匹配部署目录结构?
  • 我们移植到Apple平台框架时,源代码将与Objective-C/Swift语法不匹配

标签: c++ cmake include clion


【解决方案1】:

您需要有适当的层次结构。首先,不,你不能拥有

#include <Cryptor/MD5Encryptor.h>

使用您当前的设置,而不是在构建库时,而不是在安装文件时(CMake 可以做到)扁平化层次结构。

你可以做的是:

#include <Cryptor/core/abstract/MD5Encryptor.h>

如果您将项目添加到 Cryptor 文件夹中,而不是位于项目的根目录中。 我建议您创建一个 Cryptor.cmake 文件,以便人们在安装后获取您的库,这样他们就不必知道库包含在哪里或库名称是什么。

【讨论】:

  • 你能检查一下这个存储库github.com/MailCore/mailcore2吗?他们的头文件可以通过 包含我们可以这样做吗?如果我必须使用这些格式
  • 请注意,源层次结构不一定与安装层次结构相同。
  • 他们用这个做了一些中间(和肮脏)的事情:file(COPY ${public_headers} DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/include/MailCore" )。我不喜欢这种复制文件并拥有两次文件的方法,其中一个在第一个被更改时没有被更新 + 相对包含的所有问题。
  • @YSC 确实,您可以更改它,但最好还是保持一致性。
  • 我同意;但这可能是OP正在寻找的解决方案¯\_(ツ)_/¯
【解决方案2】:

不必指向每个单独的头文件。只需使用include_directories(PATH_TO_HEADERS) 添加包含这些头文件的所有目录。

对于头文件 src/core/CryptorCore.h 的包含

#include "CryptorCore.h"

你必须指向

include_directories(${PROJECT_DIR}/core/)

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多