cmake 如何正确地对包含'.dylib'文件的xcframework进行签名?

qltillow  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(256)

我正在用C++开发一个跨平台的库,接口与C兼容。当我试图为多个苹果平台编译这个库时,我遇到了一些与签名相关的问题。
这些问题仅在物理设备上加载资料库时出现,而在macOS或iOS模拟器上工作时不会出现。
这个库的发布格式应该是xcframework,目前,我使用CMake构建和签名每个二进制文件,然后使用以下命令创建xcframework:

xcodebuild -create-xcframework -library builds/catalyst/Release/mylib.1.1.0.dylib -headers include -library builds/macos/Release/mylib.1.1.0.dylib -headers include -library builds/ios/Release/mylib.1.1.0.dylib -headers include -library builds/ios-sim/Release/mylib.1.1.0.dylib -headers include -output Mylib.xcframework

这会导致在设备上加载库时出现以下错误:

dyld[8339]: Library not loaded: @rpath/mylib.1.1.0.dylib
  Referenced from: <3D40ED9F-BDDA-3878-80B7-52E4C1D79471> /private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/BasedClient.framework/BasedClient
  Reason: tried: '/usr/lib/system/introspection/mylib.1.1.0.dylib' (errno=2, not in dyld cache),
 '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (code signature invalid in <0E938CE1-2726-3C26-A057-49DAD2351627> '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (errno=1) sliceOffset=0x00000000, codeBlobOffset=0x004F2FF0, codeBlobSize=0x0000E810),
 '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (code signature invalid in <0E938CE1-2726-3C26-A057-49DAD2351627> '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (errno=1) sliceOffset=0x00000000, codeBlobOffset=0x004F2FF0, codeBlobSize=0x0000E810),
 '/private/preboot/Cryptexes/OS@rpath/mylib.1.1.0.dylib' (errno=2),
 '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (code signature invalid in <0E938CE1-2726-3C26-A057-49DAD2351627> '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (errno=1) sliceOffset=0x00000000, codeBlobOffset=0x004F2FF0, codeBlobSize=0x0000E810),
 '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (code signature invalid in <0E938CE1-2726-3C26-A057-49DAD2351627> '/private/var/containers/Bundle/Application/212147E0-C36B-413C-95F0-9819D78D0F9B/BasicExample.app/Frameworks/mylib.1.1.0.dylib' (errno=1) sliceOffset=0x00000000, codeBlobOffset=0x004F2FF0, codeBlobSize=0x0000E810),
 '/usr/local/lib/mylib.1.1.0.dylib' (errno=2),
 '/usr/lib/mylib.1.1.0.dylib' (errno=2, not in dyld cache)

如果我检查各个.dylib文件,它们都已正确签名。
在探索选项时,我尝试按照this指南进行操作,但由于某种原因,运行xcodebuild archive -project Mylib.xcodeproj -scheme Mylib -destination "generic/platform=iOS" -archivePath "archives/Mylib" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES会输出如下所示的文件树

.
└── Mylib_iOS_Simulator.xcarchive
    ├── Info.plist
    ├── Products
    │   └── @rpath
    │       └── mylib.1.1.0.dylib
    └── dSYMs

其中@rpath文件夹非常可疑。

whlutmcx

whlutmcx1#

我不确定您是否以正确的方式创建了XCFramework。XCFramework bundle是多个Framework的容器,而不是单个库。
你要做的就是让CMake为你创建一个框架,参见here,然后把它们粘到一个XCFramework中。如果你使用CMake创建你的框架,你也不需要手工处理头文件等。

相关问题