imfuxiao / LibrimeKit

librime to ios. use swift package manager.
19 stars 11 forks source link

M1 Pro 上编译后提示 Bool 冲突 #4

Closed BrainKu closed 11 months ago

BrainKu commented 1 year ago

环境: 系统:Mac 13.3.1 M1 Pro XCode:14.3.1

问题: 我在尝试编译 Librime 时,运行 swift build 会提示找不到在 Source/C 下的 header 文件

Building for debugging...
In file included from /Users/kumo/Documents/iOS/github/Hamster/Packages/LibrimeKit/Sources/ObjC/irime_api.m:1:
/Users/kumo/Documents/iOS/github/Hamster/Packages/LibrimeKit/Sources/ObjC/include/irime_api.h:1:9: fatal error: 'rime_api.h' file not found
#import "rime_api.h"
        ^~~~~~~~~~~~
1 error generated.
[0/1] Compiling LibrimeKit irime_api.m

将 header 文件复制到 Source/ObjC 之后可以执行 swift build 但对整个项目进行编译的时候就提示了 Bool 定义的冲突

RimeContext.swift:32:25 Cannot convert value of type 'Swift.Bool' to specified type 'LibrimeKit.Bool' (aka 'Swift.Int32')

折腾了好几天仍然不知道怎么修改,似乎只要用这个 C header 就一定会有这个 typedef int Bool 的问题

imfuxiao commented 1 year ago

目前我还在 intel x86 下编译,没有 m 系列真机环境。不清楚是否是环境因素导致。你可以直接下载通过 github action 编译的 framework 使用。

BrainKu commented 1 year ago

我试着修改了一个 demo,最终一点点排查之后发现我这里是两个问题:

  1. ObjC 引用的 C 头部文件无法通过 cSettings: [.headerSearchPath("Sources/C")] 设置,只能通过单独添加另外一个 target,并让 OC target 依赖它才能正常引用
  2. 另外一个坑的地方是,如果一个 C target 里面只有头文件没有 c 文件,那他是不会被编译的,所以我还增加了空实现的 .c 文件。

不知道是否 XCode 或者 Swift 版本的问题,但问题确实是解决了

imfuxiao commented 1 year ago

我试着修改了一个 demo,最终一点点排查之后发现我这里是两个问题:

  1. ObjC 引用的 C 头部文件无法通过 cSettings: [.headerSearchPath("Sources/C")] 设置,只能通过单独添加另外一个 target,并让 OC target 依赖它才能正常引用
  2. 另外一个坑的地方是,如果一个 C target 里面只有头文件没有 c 文件,那他是不会被编译的,所以我还增加了空实现的 .c 文件。

不知道是否 XCode 或者 Swift 版本的问题,但问题确实是解决了

我用的是最新版本的XCode ,请问你那边用的版本多少?

BrainKu commented 1 year ago

我试着修改了一个 demo,最终一点点排查之后发现我这里是两个问题:

  1. ObjC 引用的 C 头部文件无法通过 cSettings: [.headerSearchPath("Sources/C")] 设置,只能通过单独添加另外一个 target,并让 OC target 依赖它才能正常引用
  2. 另外一个坑的地方是,如果一个 C target 里面只有头文件没有 c 文件,那他是不会被编译的,所以我还增加了空实现的 .c 文件。

不知道是否 XCode 或者 Swift 版本的问题,但问题确实是解决了

我用的是最新版本的XCode ,请问你那边用的版本多少?

我这边 xcode 还只是 14.3.1,再升级需要升级系统版本。但因为当前系统版本 13.3.1 只能更新到 14.1.1 就都没动。

imfuxiao commented 1 year ago

好的,应该是 spm 的版本差异问题,cSettings 这个参数是 SPM 5 版本加入的。

https://developer.apple.com/documentation/packagedescription/target/csettings

image

BrainKu commented 1 year ago

好的,应该是 spm 的版本差异问题,cSettings 这个参数是 SPM 5 版本加入的。

https://developer.apple.com/documentation/packagedescription/target/csettings

image

很怪异的,我这边的 spm 版本应该跟你是一样的?按理说 spm 版本相同,不应该有这种问题🤣 // swift-tools-version: 5.7 // The swift-tools-version declares the minimum version of Swift required to build this package.

tansongchen commented 1 year ago

@BrainKu 您好,我是用 M2 Max 电脑来开发这个项目,下载了这个仓库编译的 Framework 文件之后,在 Xcode 中无法编译运行仓的主程序的 simulator,报错是 undefined symbol。我觉得应该是编译出的 Framework 文件缺少 arm64 架构的 simulator 代码的问题。

但是看您这边似乎可以在 M1 Pro 上编译运行?请问有遇到我上面的这个问题吗?

BrainKu commented 1 year ago

@BrainKu 您好,我是用 M2 Max 电脑来开发这个项目,下载了这个仓库编译的 Framework 文件之后,在 Xcode 中无法编译运行仓的主程序的 simulator,报错是 undefined symbol。我觉得应该是编译出的 Framework 文件缺少 arm64 架构的 simulator 代码的问题。

但是看您这边似乎可以在 M1 Pro 上编译运行?请问有遇到我上面的这个问题吗?

@tansongchen 我将系统升级到最新的 14.1.1 以及 Xcode 15 之后就没再遇到我一开始遇到的问题了。 arm64 simulator 缺失的问题我也发现了,但因为我主要是运行在真机,这里我没有影响。运行在模拟器的时候我切换到 Rosetta 也可以正常运行起来。

tansongchen commented 1 year ago

OK 的,感谢确认,那我回头按 https://github.com/imfuxiao/LibrimeKit/issues/6 里说的方法增加一下 amd64 simulator 的支持