Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错
Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错
我想在 mac 环境生成可以在 Linux 上运行的.so 文件:
export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
go build -buildmode=plugin -o xxx.so xxx.go
但是在 linux 下运行是报错:
plugin.Open("xxx.so"): xxx.so: invalid ELF header
大佬们有没有遇到过类似的问题,求解答
更多关于Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
因为 macOS 下生成的可执行文件是 Mach-O 格式,而不是 ELF 格式
更多关于Golang Go语言在mac平台下生成的.so文件,放到Linux下执行时报错的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
啊,不好意思,没有看清问题内容,无视我的回答
file 看一下格式对不对
上面加了补充,请问 mac 下如何 go build 生成 ELF 格式
大佬,上面加了补充
ARCH= OS= 你宏都不定义 跨平台编译个啥?
你如果真的用了 export CGO_ENABLED=0 GOOS=linux GOARCH=amd64
那编译出来的不会是 Mach-O 文件
而且就算你正确用了,也还是需要 gcc/clang 工具链的,相当麻烦,还是找个 linux 机器吧
CGO_ENABLED=0 是不需要 gcc/clang 的
https://github.com/golang/go/issues/19569 但 plugin 需要 cgo 。
推荐直接在目标平台下编译
谷歌的 golang 团队是时候把 go 写成和 java 一样 加个 gvm 一次编译到处运行
最简单的是用 docker 编译,一身轻松。不用担心交叉编译的问题。
go 对交叉编译支持还算比较好的了,最简单的办法还是直接用目标架构 /系统的虚拟机或在线的 CI/CD 编译。
别信 go 的交叉编译,就算能跑,二进制大小也比 Linux 下直接编译的大,经常有莫名的问题
用 Docker 拉一个最小镜像编译去
<br>我现在也遇到这样的问题 请问下当时你是怎么解决的<br>CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -buildmode=plugin -o=<a target="_blank" href="http://release.so" rel="nofollow noopener">release.so</a> main.go<br><br># command-line-arguments<br>/usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1<br>ld: unknown option: -z<br>clang: error: linker command failed with exit code 1 (use -v to see invocation)<br><br>
在Mac平台下生成的Go语言 .so
动态链接库文件在Linux下执行时报错,通常是由于以下几个原因导致的:
-
平台差异:Go语言编译时会根据目标平台生成相应的二进制文件。Mac和Linux底层系统架构(如系统调用、库文件等)存在差异,因此直接在Linux上运行Mac编译的
.so
文件会导致不兼容。 -
CGO依赖:如果你的Go代码中使用了CGO来调用C语言代码或系统库,这些库在不同平台上的实现可能不同,或者某些库在Linux上根本不存在。
-
编译器标志:编译
.so
文件时使用的编译器标志(如-ldflags
)可能影响了跨平台兼容性。
解决方案:
-
交叉编译:在Mac上使用Go的交叉编译功能来生成适用于Linux的
.so
文件。可以通过设置环境变量GOOS
和GOARCH
来实现,例如GOOS=linux GOARCH=amd64 go build -buildmode=c-shared -o libexample.so example.go
。 -
检查CGO代码:确保CGO调用的C代码或库在Linux上可用,并考虑使用条件编译来处理平台特定的代码。
-
测试与验证:在Linux环境下进行充分的测试,确保生成的
.so
文件能正确加载和执行。
通过上述方法,你应该能够解决在Linux下执行Mac编译的 .so
文件时遇到的问题。