gpt4 book ai didi

macos - CMake:FIXUP_BUNDLE 在 OS X 上创建空框架

转载 作者:行者123 更新时间:2023-12-02 11:10:35 24 4
gpt4 key购买 nike

我正在尝试使用 CMake 函数 FIXUP_BUNDLE 来修复应用程序包,但收到安装时警告,并且由于缺乏更好的术语,而不是修复包。

已安装的 bundle 具有正确的结构,但其使用的框架未正确复制。仅复制每个框架的目录结构,而不复制实际的共享库二进制文件。例如,我的 bundle 使用 SFML 2.0 的系统框架。请注意,我使用的所有 SFML 框架都存储在 /Library/Frameworks 中。以下是我在 MyApp.app/Contents/Frameworks/ 中获得的有关此 SFML 组件的内容:

sfml-system.framework/
Versions/
2.0.0/

这就是我得到的全部,只是目录。实际的 SFML 系统框架具有如下结构:

sfml-system.framework/
Resources (this is a symlink)
sfml-system (this is a symlink)
Versions/
2.0.0/
Resources/
Info.plist
sfml-system (this is the actual library binary)
Current (this is a symlink)

在我的项目中,可执行文件都具有相同的格式,因此我有一个小函数来使用这种通用格式添加它们。该函数只是添加可执行文件,设置要链接的库,并在安装时安装应用程序包并对其调用 FIXUP_BUNDLE。这是该函数:

FUNCTION(ADD_CUSTOM_EXECUTABLE TARGET HEADERS SOURCES DEPENDENCIES)
ADD_EXECUTABLE(${TARGET} MACOSX_BUNDLE ${HEADERS} ${SOURCES} ${ARGN})
TARGET_LINK_LIBRARIES(${TARGET} ${DEPENDENCIES})

INSTALL(TARGETS ${TARGET} BUNDLE DESTINATION .)

INSTALL(CODE "
INCLUDE(BundleUtilities)
FIXUP_BUNDLE(${CMAKE_INSTALL_PREFIX}/${TARGET}.app \"\" \"\")
")
ENDFUNCTION(ADD_CUSTOM_EXECUTABLE)

我没有为 FIXUP_BUNDLE 的 LIBS 或 DIRS 参数传递任何内容,因为我当前没有使用任何插件。 ALL_BUILD 项目在 Xcode 中构建良好,并且安装项目运行不会失败,但对于通过 otool -L 发现的每个库都会产生许多这样的警告。下面的示例显示了 SFML 系统框架的警告几乎在调用 FIXUP_BUNDLE 后立即开始:

fixup_bundle
app='/Users/user/Desktop/SFML_Testing_BUILD/dist/MyApp.app'
libs=''
dirs=''
fixup_bundle: preparing...
warning: embedded item does not exist 'Users/user/Desktop/SFML_Testing_BUILD/
dist/MyApp.app/Contents/Frameworks/sfml-system.framework/Versions/2.0.0/
sfml-system'
warning: cannot resolve item '@executable_path/../Frameworks/
sfml-system.framework/Versions/2.0.0/sfml-system'

possible problems:
need more directories?
need to use InstallRequiredSystemLibraries?
run in install tree instead of build tree?

不久之后,类似这样的事情:

warning: target '@executable_path/../Frameworks/sfml-system.framework/Versions/
2.0.0/sfml-system' is not absolute...
warning: target '@executable_path/../Frameworks/sfml-system.framework/Versions/
2.0.0/sfml-system' does not exist...
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/
usr/bin/otool: can't open file: @executable_path/../Frameworks/
sfml-system.framework/Versions/2.0.0/sfml-system (No such file or directory)
otool: can't open file: @executable_path/../Frameworks/
sfml-system.framework/Versions/2.0.0/sfml-system
(No such file or directory)

有谁知道如何解决这个问题吗?我在互联网上搜索解决方案,但没有运气。

最佳答案

如果您尝试引入的框架位于“/Library/Frameworks”中,则假定它是一个“系统库”,实际上并不需要引入...假设是,如果您依赖在已安装的系统库(而不是您自己在某处构建的系统库)上,那么您的最终用户也将拥有相同的已安装系统库。 (您必须要求他们在安装您的应用程序之前安装 SFML。)

我们这样做的目的是防止人们意外地将系统框架包含在他们的 bundle 中,而法律上不应该包含这些框架。 bundle SFML 框架是否合法是您的负担。

如果这个假设在您的情况下是错误的,并且您希望 SFML 内容被视为“非系统”,您可能必须自定义 BundleUtilities 来处理它。

不过,先尝试一下会更容易:编写一个脚本,首先将它们复制到构建树包中,然后安装该包,并在尝试以下自定义覆盖之前查看 fixup_bundle 是否适用。

如有需要,您可以尝试按如下方式进行自定义:

首先,将带有内联代码的 install(CODE 片段更改为 install(SCRIPT 调用,该调用调用已配置/生成的脚本文件。否则,将有太多代码要放入该 block 中,并且所有转义都会变得令人讨厌.

接下来,在脚本中包含 BundleUtilities 之前,为 GetPrecessions gp_resolved_file_type 函数添加一个覆盖函数。这就是 BundleUtilities 用来声明一个库是否是“系统”库的方法。将为 BundleUtilities 需要的每个文件类型解析调用名为 gp_resolved_file_type_override 的覆盖函数。您可以编写它来简单地将库名称与字符串“sfml”相匹配,如果匹配,则将类型声明为“other”,您的声明将获胜。

之后,上述一些警告应该会消失,但您可能会遇到其他需要进一步自定义的问题。

这有点令人讨厌和复杂,但应该可以使用现有的 CMake...

但是:

BundleUtilities 为系统库引入任何内容的事实是一个错误,应该将其报告为 CMake 错误跟踪器中的错误:http://www.cmake.org/Bug

关于macos - CMake:FIXUP_BUNDLE 在 OS X 上创建空框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11875442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com