- 主题:c++20编译的程序在c++17的环境上跑
其他动态链接的依赖都是c库的话(比如glibc,libz),一般就没问题。当然你的静态部分和动态部分互相要版本依赖正确,这是编译运行环境不同时总要考虑的。
有的项目可以全部依赖都静态链接,出的依赖问题最少。但这也不好做到,比如c库需要换成支持全静态的比如musl。
【 在 lwp 的大作中提到: 】
: 所以我只是想问,除了这两个要静态链接,还有没有其它问题要注意的?
:
:
: ...................
--
FROM 114.254.10.*
生成兼容的二进制,问题主要在API版本依赖和ABI,而不是编译器或所用语言版本。对运行环境那边考虑的是cpu体系结构,操作系统,ABI,库版本这些。你把这个事情考虑成交叉编译会清楚一些。
静态链接libgcc和libstdc++可以解决一部分问题,前者主要是gcc版本的差异,后者主要是c++标准库的差异。你依然可能遇到glibc的版本依赖问题(这和c++以及gcc版本都无关),第三方c++库的依赖问题,甚至系统内核版本问题。
省事的办法,比如docker,把整个依赖环境都带上;或者想办法全静态编译。
【 在 lwp 的大作中提到: 】
: 编译的时候用上-static-libgcc -static-libstdc++
:
: 把这两个东西都静态链进去,是不是就行了?
: ...................
--
FROM 114.254.10.*
就这也不顶用。首先目标环境的glibc版本大概率降挺多的,也就是说你大概率不兼容。其实你这样写个hellowold都大概率不兼容,试试就知道了。
你报个linux发行版的版本都有用一点。
考虑到你要用c++20,建议你分别考虑如下几种解决方案:
1. 用crosstool-ng之类工具,配置目标环境的系统内核版本,glibc版本,构建交叉编译环境,之后从源代码安装目标环境对应版本的依赖库,最后静态链接所有c++语言接口的库和libgcc,其他c语言接口库可以动态链接。
2. 用crosstool-ng之类工具,配置目标环境版本,用musl库,构建交叉编译环境,从源代码安装所有依赖库,然后尝试全静态编译你的程序。
3. 用 docker。
【 在 lwp 的大作中提到: 】
: 我发贴是不是非要说gcc11.3的编译器编的程序在gcc7.5的环境上跑才行
:
: 【 在 dormouseBHU 的大作中提到: 】
: ...................
--
FROM 114.254.10.*
你没试试然后发现新系统上写的helloworld在老系统上跑不起来?运行时会告诉你GLIBC版本问题。
这事情没你想的那么轻松。
你要都是自己的程序自己的环境里自己用,重编译最省事,真的。
【 在 lwp 的大作中提到: 】
: 没那么复杂,只是os从乌班图18升到22了,想直接上c++20,顺便兼容一下老的
:
:
: ...................
--
修改:milksea FROM 114.254.10.*
FROM 114.254.10.*