CMake + Xcode:如何选择arm64 vs x86_64库?



我们有一个基于CMake的项目,目标是Xcode,并且必须包含一个预编译的第三方库,提供单独的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(苹果硅,英特尔)"构建),然而,当每个体系结构抱怨另一个时,它会导致一堆链接器警告。

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

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

编辑,我之前误解了。我认为你有三个选择

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

忽略它,或者只是更改目标

的link选项。
  • 尝试最新的cmake概念IMPORTED_TARGET,它看起来完全符合您的需求,但需要新的cmake版本
  • 尝试从源代码编译一个通用库,这是一些例子更改标志或cmake官方示例,但这看起来需要另一个项目的源代码库

UPDATE:已接受答案:根据这里链接的IMPORTED_TARGET文档,它揭示了你可以在库路径中使用符号$(CURRENT_ARCH),它在链接时由Xcode解释。

完美工作。

您可以将两个.a文件合并到fat二进制文件中,并使用合并后的库进行编译。链接器将根据架构选择正确的版本。

要组合。a库文件,可以使用lipo命令:

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

合并后的库文件可以被重用,直到需要对库进行更新。或者,如果您不喜欢手动管理库,您可以创建一个聚合目标,以便在每次编译时组合库文件。