1

我们有一个针对 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
)

这似乎导致两种架构的有效编译(为“Any Mac(Apple Silicon,Intel)”构建),但是当每个架构抱怨另一个架构时,它会导致一堆链接器警告。

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

反之亦然。

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

4

2 回答 2

1

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

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

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

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

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

完美运行。

于 2021-10-21T14:02:50.100 回答
1

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

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

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

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

于 2021-10-22T16:17:26.763 回答