不懂就问:其他电脑编译好的二进制文件可以直接到其他机器使用吗?

2020-11-01 14:18:35 +08:00
 solider245
如题,经常遇到很多文件因为网络问题无法安装。
那么,我可以在其他电脑将二进制文件编译好,然后再通过网盘工具或者其他下载工具,将其下载到本地电脑直接使用吗?

比如我有一台香港的 ubuntu 服务器,编译安装好了一个软件,然后将其打包,我本地有一台电脑,直接将软件下载到本地,然后解压缩直接使用。可以这样吗
7223 次点击
所在节点    Linux
38 条回复
haohaolee
2020-11-01 22:12:29 +08:00
这个问题涉及到的因素太多了,建议你先保证两边的操作系统一致,比如 ubuntu xx.xx x86_64,然后试着先编译出来看看。不行的话具体问题具体分析
crayygy
2020-11-01 22:26:34 +08:00
当然可以,一个简单的例子就是 Android 和 iOS 本身并没有办法在自己的平台上编译出二进制,而是依赖其它桌面平台来编译二进制来使用。
只是要处理好平台依赖,所以类似于 Windows Linux 和 Mac 之间,或者 ARM X86 可能会有些平台特有的 ABI 接口问题(也是可解决的),但同一个平台理论上还是比较好处理依赖的
owt5008137
2020-11-01 23:08:14 +08:00
所有的依赖 ABI 兼容就可以。至于怎么知道 ABI 是否兼容,linux 内核版本升级
owt5008137
2020-11-01 23:11:16 +08:00
接上条。没写完不小心按了回复。
linux 和 gcc,glibc 这十几年的升级都是 ABI 兼容的,其他的我不清楚,得看依赖的库了。其他的库如果能全部静态链接大概率也行。
systemcall
2020-11-01 23:21:18 +08:00
感觉用 docker 就行了
只要你的电脑可以运行 docker,不管是 Windows 还是 macOS 、Linux 都可以。当然,都得是 AMD64 架构。你要是用的 Aarch64,应该会弄交叉编译
下载的二进制文件有时候会有些稀奇古怪的问题,不会搞的话就用 docker,省事
systemcall
2020-11-01 23:24:58 +08:00
你要是在自己的电脑上装个一样的系统。依赖之类的弄好,拷过来基本上不会有什么问题
3dwelcome
2020-11-01 23:25:16 +08:00
我开开心心的交叉编译,结果运行的时候来一个 kernel too old,其他 abi 都对,给我跳这个,心累。
xiadong1994
2020-11-02 01:54:49 +08:00
@Tumblr 我的第一反应也是这个,楼主不会认为装的二进制包都是本地编译的吧
Bromine0x23
2020-11-02 09:08:11 +08:00
可以,但不是随便就可以
p1gd0g
2020-11-02 09:15:44 +08:00
话说上次 go 编译遇到 glibc 版本无法运行的问题。
no1xsyzy
2020-11-02 09:22:44 +08:00
@3dwelcome 这就是 docker 出场的时候了
newmlp
2020-11-02 09:36:07 +08:00
一个程序要运行起来需要很多操作系统相关的东西,
ungrown
2020-11-02 10:04:18 +08:00
@msg7086 #14 相邻发行版直接拷过去试一试保不齐也能用
我自己的 VPS 和家里服务器之间这样弄过几次,跨越的版本是 16 和 18
缺了依赖的库有时可以手动装上,PPA 或者直接网站上下下来扔到路径里
ungrown
2020-11-02 10:08:11 +08:00
@solider245 #20 中文资料很少的
因为英文社区异常活跃
很多非英语母语的人遇到问题如果母语资料不够用也会硬着头皮去英语社区用英语询问交流
久而久之全世界的人都在向英语社区共享问题、答案、经验、讨论、猜想、验证……
中文用户当然也逃不掉
所以直接英文搜索是最可能找到具体解决方案的,再不济直接用英文开贴询问
flyico
2020-11-02 10:13:53 +08:00
只要没有特别的依赖,大部分是没问题的,我曾经在 centos6 上编好的 binary,拷到 Ubuntu18.04 上能直接运行
libook
2020-11-02 10:36:42 +08:00
程序需要关心的大体是这几层:硬件指令集、操作系统 API 、依赖(如动态链接库)、运行时(Runtime)、环境配置(如环境变量)。
如果你两台机器这几层都互相兼容,那么你从一台机器编译的程序可以直接在另一台机器运行。

网络问题可以尝试用代理解决,或者使用镜像源。
服务型软件可以考虑用容器方案,可以在各个地方使用极度相同的环境。
yklaxds
2020-11-02 13:53:22 +08:00
打包成 appimage 就可以了。
CodeCodeStudy
2020-11-02 16:32:25 +08:00
用 Golang,可以交叉编译

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/720696

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX