CMake + Xcode:如何 select arm64 vs x86_64 库?

CMake + Xcode: how to select arm64 vs x86_64 libraries?

我们有一个针对 Xcode 的基于 CMake 的项目,并且必须包括一个预编译的第三方库,它提供单独的 arm64x86_64 二进制文件。

我们现在的工作是简单地附加两个二进制文件,例如

add_library( someLib INTERFACE )

add_library( someLib_x64 STATIC IMPORTED )
set_target_properties(
  someLib_x64
  PROPERTIES
    IMPORTED_LOCATION_RELEASE "path/to/x64/libsomeLib.a"
)

add_library( someLib_arm STATIC IMPORTED )
set_target_properties(
  someLib_arm
  PROPERTIES
    IMPORTED_LOCATION_RELEASE "path/to/arm/libsomeLib.a"
)

target_link_libraries(
  someLib
  INTERFACE
    someLib_x64
    someLib_arm
)

这似乎导致了两种架构的有效编译(为“任何 Mac(Apple Silicon,英特尔)”构建),但是它会导致一堆 linker 警告,因为每个架构抱怨另一个。

ld: warning: ignoring file /path/to/x64/libsomeLib.a, building for macOS-arm64 but attempting to link with file built for macOS-x86_64

反之亦然。

避免 linker 警告的更准确的方法是什么?我找不到适用的生成器表达式来更改 link 路径?

已编辑,我之前误解了这一点。我想你有 3 个选择

  • 抑制错误,错误实际上不会影响任何东西,所以最简单的方法是
add_link_option("-w")

忽略它,或者只是更改目标的 link 选项

  • 尝试最新的 cmake 概念 IMPORTED_TARGET,看起来完全符合您的需求,但需要新的 cmake 版本
  • 尝试从源代码编译一个通用库,这是一些例子 change flag or cmake official example,但这看起来需要另一个项目来获取 lib
  • 的源代码

更新:已接受的答案: 根据此处 IMPORTED_TARGET linked 的文档,它显示您可以在库路径中使用符号 $(CURRENT_ARCH),它由 Xcode 在 [=36= 处解释] 时间。

完美运行。

你可以将这两个.a文件合并成fat binary,使用合并后的库进行编译。链接器将 select 基于架构的正确版本。

要合并.a库文件,可以使用lipo命令:

lipo -create 'path/to/x64/libsomeLib.a' 'path/to/arm/libsomeLib.a' \
     -output 'path/to/combined/libsomeLib.a'

可以重复使用合并的库文件,直到您需要安装库更新。或者,如果您不想手动管理库,则可以在每次编译时创建一个聚合目标来组合库文件。