生成 macOS 框架时如何保留公共标头的目录布局

2024-01-24

我有一个 C++ 库的 CMake 项目(当前版本为 CMake v3.21),我正在将其移植到 macOS,并且我正在考虑将该库生成为操作系统框架 https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Frameworks.html.

到目前为止,我已经遵循了 CMake 的文档添加库 https://cmake.org/cmake/help/v3.21/command/add_library.html?highlight=add_library,并添加了FRAMEWORK属性到库目标CMake 关于其 FRAMEWORK 目标属性的文档 https://cmake.org/cmake/help/v3.21/prop_tgt/FRAMEWORK.html。这似乎大部分工作,除了作为其一部分导出的头文件PUBLIC_HEADER属性的目录结构从导出中被剥离和扁平化。

为了说明这个问题,让我们考虑以下项目树:

include
└── A
    ├── A.hpp
    └── subA
        └── SubA.hpp
src
├── A.cpp
└── SubA.cpp

以下 CMake 项目在 macOS 上编译时会生成 OSX 框架:

cmake_minimum_required(VERSION 3.21)

project(libA LANGUAGES CXX)


set(a_INCLUDES
    include/A/A.hpp
    include/A/subA/SubA.hpp
)

set(a_SOURCES
    src/A.cpp
    src/SubA.cpp
)

add_library(a
    ${a_INCLUDES}
    ${a_SOURCES}
)

set_target_properties(a
    PROPERTIES
    FRAMEWORK YES
    PUBLIC_HEADER "${a_INCLUDES}"
)

target_include_directories(a
    PUBLIC
    ${CMAKE_SOURCE_DIR}/include
)

然而,生成的框架扁平化了其包含的头文件的目录结构。Headers, 如下所示:

build/a.framework
├── Headers -> Versions/Current/Headers
├── Resources -> Versions/Current/Resources
├── Versions
│   ├── A
│   │   ├── Headers
│   │   │   ├── A.hpp
│   │   │   └── SubA.hpp
│   │   ├── Resources
│   │   │   └── Info.plist
│   │   └── a
│   └── Current -> A
└── a -> Versions/Current/a

所以,我的问题是:CMake 是否支持保留作为 OSX 框架一部分提供的公共标头的目录树布局?如果是这样,我们需要在项目中做什么才能确保保留目录树布局?


虽然您希望将公共和私有标头放置在以下位置,包括它们的相对路径Headers目录这不是您所经历的情况。整个路径组件被剥离。这同样适用于分层结构的资源Resource目录。

为了实现这一目标,您可以做的是设置MACOSX_PACKAGE_LOCATION使用每个标头的属性set_source_files_properties命令。该位置是标头的路径加上Headers前缀,例如Headers/A为您A/A.hpp标头和Headers/A/subA为您A/subA/SubA.hpp header.

通常,项目会使用一个小的便利函数来实现此目的,从给定的标头中删除不需要的前缀和文件名,并添加安装前缀。

function(set_macosx_properties _file_prefixes _install_prefix _source_files)
  foreach(_file ${_source_files})
    get_filename_component(_loc "${_file}" DIRECTORY)
    foreach(_prefix ${_file_prefixes})
      string(REPLACE "${_prefix}" "" _loc "${_loc}")
    endforeach()
    set_source_files_properties(${_file} PROPERTIES MACOSX_PACKAGE_LOCATION ${_install_prefix}${_loc})
  endforeach()
endfunction()

根据您的头文件和资源文件的提供方式,您将像这样使用它:

set_macosx_properties("include" "Headers" "${a_INCLUDES}")

set_macosx_properties("data" "Resources" "${a_RESOURCES}")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成 macOS 框架时如何保留公共标头的目录布局 的相关文章

随机推荐

  • 如何用vb6查询网站?

    vb6中查询网页的函数是什么 我想做的是从雅虎财经获取数据 例如 此 url 返回一个 csv 文件 其中包含通用电气的股息值 我需要在函数中运行它并让函数返回答案 说到 Excel 您可以创建网络查询 http office micros
  • 在 Mac 上更新 Python

    我想在 mac 上将 python 2 6 1 更新到 3 x 但我想知道是否可以使用终端来完成此操作 或者我必须从 python 网站下载安装程序 我问这个问题是因为安装程序没有更新我的终端 python 版本 OS X 上的默认 Pyt
  • Hibernate 导致:org.hibernate.AnnotationException:未知的mappedBy

    我有两节课 Entity Table name profil public class Profil Id GeneratedValue strategy GenerationType AUTO Column name id private
  • 将 Tensorflow 中除 max 之外的所有值归零

    我有一个数组 0 3 0 5 0 79 0 2 0 11 我想将除最大值之外的所有值转换为零 所以结果数组将是 0 0 0 79 0 0 在 Tensorflow 图中执行此操作的最佳方法是什么 如果你想保留最大值的所有出现 你可以使用 c
  • 使用 Paramiko 进行递归目录下载?

    我想通过 SSH 递归下载一个包含未知内容的目录 并一直在尝试 Paramiko 我看过几个如何上传目录的示例 但没有一个示例涵盖递归下载 我可以列出目录中的所有项目 但无法找到一种方法来了解该项目是文件 要下载 还是目录 要递归调用 tr
  • 如何在 Mac OS X 10.5 中处理 Finder 中的多个文件拖放操作?

    我需要获取从 Finder 拖 放到我的应用程序中的所有文件的 URL 我有一个在 10 6 上运行的 Cocoa 应用程序 它通过使用新的 10 6 NSPasteboard API 来处理粘贴板上的多个项目 我正在尝试将此应用程序向后移
  • Windows Phone 7、登录屏幕重定向和 .exit 案例?

    我知道这个问题已经被讨论得令人作呕 但我想介绍一下我的情况 我的应用程序中的起始页是login xaml 用户登录 用户名和密码通过我的WCF服务进行身份验证 用户名保存在独立存储中 然后用户被重定向到mainpage xaml 当用户启动
  • NSTableColumn 大小适合内容

    我正在 Mac OS X 10 6 Snow Leopard 中进行开发 当我在 NSTableView 的两个列标题之间双击时 左侧的列会自动调整大小 就像您所期望的那样 我也想在上下文菜单中提供此功能 但似乎没有可公开访问的功能来执行此
  • 将具有 is-inactive 类的元素的光标设置为默认值

    客观的 一旦选择了每个类别的最大球员人数 两名守门员 六名后卫 十二名前锋 剩余的球员picked与班级is inactive应设置为cursor default 问题的澄清 所有球员都有班级is inactive作为默认值 我想做的是尝试
  • 从浏览器地址栏执行 Javascript 方法 - GWT

    我试图通过在浏览器 URL 地址栏上执行以下命令来在我的 Web 应用程序上执行 Javascript javascript window alert test void 0 但是 什么也没有发生 警报框也没有出现 原因可能是应用程序在 D
  • 在 Firestore (NodeJS) 上的文档中设置文档引用

    我正在尝试使用 NodeJS v8 6 0 创建一个包含 Firestore 参考的文档 像这样 const admin require firebase admin admin initializeApp credential MY CR
  • 2D 和 3D 数组的动态分配/释放

    我知道动态分配 取消分配 2D 数组的算法 但是我不太确定 3D 数组的算法 利用这些知识和一点对称性 我想出了以下代码 在编码过程中我很难以 3D 形式进行可视化 请评论正确性并建议任何更好的替代方案 效率或直观 如果有 另外 我认为这些
  • iOS的睡眠功能是什么

    我正在寻找一个函数 可以让 iOS 上的 C 代码甚至 Objective C 代码的线程进入休眠状态 我的编译器无法识别 sleep 0 Thanks 阻止 0 5 秒 NSThread sleepForTimeInterval 5
  • 从 R 中的大型 .CSV 导入和提取随机样本

    我正在 R 中进行一些分析 需要处理一些大型数据集 10 20GB 存储在 csv 中 并使用 read csv 函数 由于我还需要将大型 csv 文件与其他数据帧合并和转换 因此我没有计算能力或内存来导入整个文件 我想知道是否有人知道导入
  • 使用 C# 驱动程序将 UDT 元素添加到 Cassandra 中的列表集合的正确方法是什么?

    我有一个 UDT 列表 例如 create table MyTable stuff list
  • 将嵌入的 Pod 打印为带 termcap 转义的格式化文本

    我正在尝试将嵌入式 Pod 作为 ANSI 文本输出到终端 在 Perl 5 中我可以使用Pod Text Termcap https metacpan org pod Pod Text Termcap use strict use war
  • 如何中止来自 Observable 的 Ajax 请求?

    我的代码包含这个简单的函数 我用它来将文件上传到我的 PHP 服务器 有一个xhr请求嵌套在RxJS Observable fileUpload file File Observable
  • VB.NET 中从另一个线程挂起一个线程

    我有一个从线程 我们称之为 MainThread 运行的窗口 以及一个执行其他非图形任务的后台线程 有时后台线程会调用MessageBox Show 方法 即modal并停止后台线程 在此调用之前 我想挂起 MainThread 并在之后恢
  • Html 选取框标签

    html marquee 标签是否已弃用 如果是 现代浏览器上有哪些替代方案 我想在我的 joomla 页面上创建一个简单的字幕效果 html marquee 标签是否已弃用 不 它首先必须成为语言的一部分才能被弃用 它只是专有的 如果是
  • 生成 macOS 框架时如何保留公共标头的目录布局

    我有一个 C 库的 CMake 项目 当前版本为 CMake v3 21 我正在将其移植到 macOS 并且我正在考虑将该库生成为操作系统框架 https developer apple com library archive docume