一个go语言编译成ios的动态库的高手问题?求解答?

一个go语言编译成ios的动态库的高手问题

package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

/*
#cgo CFLAGS: -g -Wall
#include <stdio.h>
*/
import "C"

//export test1111
func test1111() {
    fmt.Println("Hello World wangpengyu")
}

func main() {
    test1111()
    fmt.Println(runtime.GOOS, runtime.GOARCH)
    g := sync.WaitGroup{}
    for x := 0; x < 1; x++ {
        go func() {
            for {
                g.Add(1)
                fmt.Println("aaaa")
                time.Sleep(1 * time.Millisecond)
                g.Done()
            }
        }()
    }
    g.Wait()
}

然后执行:
GOOS=ios&&GOARCH=amd64&&CGO_ENABLED=1&&go build -ldflags="-s -w" -o libmylibrary_arm64.dylib -buildmode=c-shared main.go

然后xcode运行后报
Building for 'iOS-simulator', but linking in dylib (/Users/interface/xcode/ios_use_go_so_test/libmylibrary.dylib) built for 'macOS'

1

阅读 905
avatarAI BotBETA

你遇到的问题是在构建用于 iOS 模拟器的动态库时,链接到一个为 macOS 构建的 dylib 文件,导致错误。

问题的原因是你使用 go build 命令编译 Go 代码,生成了一个为 macOS 构建的动态库 libmylibrary.dylib,然后你尝试在 iOS 模拟器上运行它。这是不可能的,因为两者的动态库不兼容。

解决方案:

  1. 为 iOS 构建动态库:你需要使用专门为 iOS 构建的 C/C++ 头文件和库。如果你使用 go build 命令,你需要指定正确的 -buildmode-tags 参数。
  2. 使用交叉编译:你可以使用交叉编译的方式,为 iOS 生成一个动态库。在这种情况下,你需要一个支持 iOS 的交叉编译器。
  3. 使用 Go 的移动开发工具包(Mobile Development Toolchain):如果你打算在 iOS 上使用 Go 语言编写的代码,你可以考虑使用 Go 的 Mobile Development Toolchain。它包含为 iOS 和其他移动平台构建的原生 Go 代码的工具链。

在你的代码中,你需要做以下更改:

  1. #cgo CFLAGS: -g -Wall 更改为 #cgo CFLAGS: -D__IOS__ -I<path_to_ios_includes> -I<path_to_go_mobile_includes>。将 <path_to_ios_includes> 替换为你的 iOS 头文件所在的路径,将 <path_to_go_mobile_includes> 替换为你的 Go Mobile的头文件所在的路径。
  2. #include <stdio.h> 更改为 #include <stdio.h>(仅在需要时更改)。
  3. 你可能需要将 Go 的导入路径更改为 import "C"
  4. 你需要确保你的 Go 代码和 C/C++ 代码都可以在 iOS 上运行。这可能需要一些额外的修改和测试。
  5. 使用适当的 C/C++ 编译器和链接器来生成针对 iOS 的动态库。
  6. 你可能需要考虑使用 Go 的 Mobile Development Toolchain,以简化在 iOS 上使用 Go 语言的过程。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题