不同版本的 Linux 编译的 c/c++程序是否通用

2021-01-29 18:04:02 +08:00
 lbmjsls1

一直有个疑问,因为今天推荐的 linux 帖子很多,自己也想试试其他系统,换个口味。

问题就是,公司的线上服务器是 debian,所以开发机也是 debian,c++程序。是否可以在其他版本的 linux 下开发编译,然后在 debian 的系统上运行。

或者退而求其次,在 debian 系的系统上开发编译,然后在 debian 的系统上运行。

不考虑配置编译服务器等情况,只是好奇这种跨 linux 的是否可以通用。比如 ubuntu/suse/arch 上编译的程序是否可以在 debian 上正常运行性。

7997 次点击
所在节点    Linux
49 条回复
BrettD
2021-01-30 14:29:46 +08:00
@DinoStray 操作系统可执行文件都是 ELF 格式,楼主的这个问题算是运行时库的问题
FrankHB
2021-01-30 17:22:33 +08:00
Linux 系统调用看 11L 。
glibc:
https://abi-laboratory.pro/?view=timeline&l=glibc
libstdc++ 在 GCC 5 以后是明确有 ABI brakage 的(为了 C++11 conformance )。比起 MSVC 已经靠谱得多了,但考虑到 Linux 上 C++ 运行时基本是当系统库部署的,基本不会打包(除非 nix/guix 那种)。但如果你已经会自己对付这种部署问题,就问不出来问通用不通用的问题了。所以凉拌。
还有库的各种 ABI bug 得看具体版本。
jim9606
2021-01-30 17:46:58 +08:00
@pwli 操作有点复杂,参考这个 ( https://tldp.org/HOWTO/Glibc2-HOWTO-6.html )
通过 -nostdinc -nostdlib 等开关禁止自动引入基础库,然后手动加入旧版 glibc 的包含目录和链接库。
一般还是用 docker 或者 chroot 解决比较省事
zeroxia
2021-01-30 19:24:53 +08:00
开发机器开发完,拿到运行机器上编译一个不就行了。或者准备一台和运行机器一样软件环境的编译机。Linux 软件分发不都是源代码级别的吗?
jinliming2
2021-01-30 20:11:28 +08:00
@LeeReamond 你也不看看你电脑上装了多少个版本的 C++ 运行库……
wangxn
2021-01-30 22:18:12 +08:00
@LeeReamond Win Vista/7/10 添加的 Win32API 实在太多了,一个现在开发的程序跑不起来不是什么奇怪的事情。例如 Chrome 这些就不支持 XP 。
wslzy007
2021-01-30 23:40:31 +08:00
小心选择交叉编译环境就行了。重点在于 glibc 、内核及 gcc 版本。。。
我的 SG 项目编译后基本就是“系统+cpu 架构”,也就是 linux-x86_64 通用、linux-arm 通用等。。。
github.com/lazy-luo/smarGate
Lemeng
2021-01-30 23:46:22 +08:00
可行
libook
2021-02-01 10:24:29 +08:00
多数情况下可以通用。

需要注意的就是,CPU 架构要一样,且调用的系统 API 两边都有,最后就是依赖的动态链接库两边都有。

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

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

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

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

© 2021 V2EX