c++ - 在 OSX 上使用 CMake 将 Adob​​e 的 XMP 工具包构建为共享库的最简单方法是什么?

标签 c++ macos cmake adobe xmp

我正在整理一个应该是跨平台的小项目,使用 CMake 构建,并且需要与 Adobe's XMP toolkit 链接。 (libxmp)。理想情况下,我希望 CMake 负责一次性构建依赖项,包括 libxmp

不幸的是,XMP 工具包设计为使用 OSX 上的 XCode 和 Linux 上的 CMake 构建。 CMake 构建过程似乎无法在 OSX 上开箱即用。

为了在 OSX 上使用 CMake 进行构建,我可以对 XMP 工具包进行最小的更改是什么?我应该继续努力直到它起作用,还是这是一个已知/已解决的问题?更一般地说,我应该在自己的 CMakeLists.txt 文件中添加哪些内容才能将此项目与我自己的项目集成?

最佳答案

今天我学到了一些东西,一些误解显然已经消失了。

在满足第三方依赖项要求(expat 和 zlib;这只是将文件从源 tarball 提取到指定位置的问题)后,一旦我意识到可以从命令行利用 XCode,这就变得非常容易, XMP 自己的“构建系统”有足够的工具来完成我需要的一切。

简而言之,从 build 目录:

./cmake.command 64 Dynamic WarningAsError ToolchainLLVM.cmake
cd xcode/dynamic/intel_64
xcodebuild -scheme ALL_BUILD build

然后,可以在 public/libraries/macintosh/intel_64/Debug 下找到框架文件,并且包含内容已在 public/include 下可用。

经过一些自由的符号链接(symbolic link)后,在我自己的项目的 CMakeLists.txt 中,这只是一个问题:

target_compile_definitions(myProject
    PUBLIC
        MAC_ENV
)

target_include_directories(
    myProject
    PRIVATE
        include/libxmp
)

# Add build dir to path for finding frameworks (libmxp)
set_target_properties(
    myProject 
    PROPERTIES
        LINK_FLAGS "-Wl,-F${CMAKE_BINARY_DIR}/Frameworks"
)

target_link_libraries(
    myProject
    PRIVATE
        catch
        "-framework XMPCore"
        "-framework XMPFiles"
)

它肯定可以被巧妙地处理,但否则这确实“有效”。


如果您使用的是 XMP Toolkit 2016.07(并且在撰写本文时,没有更新的版本)并且拥有 Xcode 10+ 和 Mojave,则在构建之前您需要整理一些补丁:

  1. Xcode version detect fix
  2. stdlib config fix
  3. Map/pair type alias fixes

此外,如果您使用 expat 2.2.2 或更高版本:

  1. expatxmlparse.c 顶部定义 HAVE_ARC4RANDOM_BUFXML_POOR_ENTROPY(因为 libxmp 构建系统不会为您执行此操作)

关于c++ - 在 OSX 上使用 CMake 将 Adob​​e 的 XMP 工具包构建为共享库的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52879637/

相关文章:

c++ - 使用 std::wstring 或 wchar_t 进行 Poco 日志记录

macos - Vagrant 不会仅转发端口 80

latex - CMake 和 latex

c++ - 在特定的 cmake 目标之前运行 npm 命令

针对复杂构建过程(包括 externalProject)的 CMake 设置建议

c++ - Tensorflow Lite arm64 错误 : cannot convert ‘const int8x8_t?

c++ - 调用 xSemaphoreGive 后,xSemaphoreTake 不会恢复任务

c++ - std::array :通过智能指针访问元素的成员

objective-c - CALayer _layer 没有在应用程序启动时初始化?! (OSX、 cocoa )

macos - NSWindow 的标题作为指示器弹出按钮