Ubuntu,我有一个软件,只有源码,没有二进制包
需要在内网用。我在外网安装好dev的依赖包,然后编译,编译完成之后在内网还是没法用。难道连依赖包也得是源码编译才行? 内网没装依赖 根据控制变量法, 这就是网络的区别吧(For real: 用 `ldd <编译好的二进制文件>` 看一下缺什么动态链接库文件, 然后再对应地装依赖试试 依赖包,动态链接库,处理器架构,glibc版本,都看看? 试试弄个静态编译的版本,大不了二进制文件大小起飞 本帖最后由 香港记者巴拉森 于 2022-9-7 08:50 编辑
依赖包的文件不在你内网的环境变量里?
—— 来自 Xiaomi M2007J17C, Android 10上的 S1Next-鹅版 v2.5.4 外网环境编好后构建成容器,然后拷贝到内网用? 如果内网Ubuntu的glibc版本比外网的低,最好是静态链接
glibc不能静态链接,要完全静态链接得用musl libc之类的才行,可以直接从 https://musl.cc/ 下工具链,带gcc,也可以直接用clang,不过需要设置--sysroot和--gcc-toolchain
如果没法用musl libc,可以把内网的/usr/include还有库拷出来,然后编译的时候设置--sysroot
其他依赖最好是静态链接,不能的话需要内网机器上也有,可以直接安装,也可以和可执行文件放在一起(但默认是绝对路径,改为相对路径需要链接的时候设置链接flag -rpath $ORIGIN,注意写法和转义,或者链接之后使用patchelf来hack一下),可以通过ldd来测试 whzfjk 发表于 2022-9-7 11:00
拖家带口自备依赖链甚至自编 C 库本质上是在重复 docker 干的是吧(
其实docker是邪道,你看Windows从来不需要这样解决依赖问题
容器本来是做隔离的,现在有多少docker是用来做隔离呢?
另外docker解决不了这个问题,docker的guest和host共享内核,如果guest中的程序依赖的操作系统调用在host的内核中没有实现,就会出错。因此通常要求docker运行时的host的内核版本号要大于等于docker里面的程序假设的内核版本号 打包成snap有没有搞头 whzfjk 发表于 2022-9-7 21:48
windows 不是系统包袱很大,同时第三方程序都拖家带口把 dll 带全了么
遇到缺 vc++ redistributable 和特 ...
拖家带口这问题不大啊,又占不了多少空间
缺vc++ resdistributable那是因为应用没自己带
.Net Framework那是另外一个问题了,不过.Net Framework兼容性还是挺好的,总共不兼容的也就三代吧(.Net 1.0-1.1, 2.0-3.5, 4.0-4.8),一般后面两个都装就没问题了
r_ex 发表于 2022-9-7 14:22
其实docker是邪道,你看Windows从来不需要这样解决依赖问题
容器本来是做隔离的,现在有多少docker是用来 ...
都有源码了,按内网机子的内核版本制作一个docker镜像不是更简单?
有些程序想改成全静态链接还真不算好弄,特别是内核版本不同的情况下 mp5 发表于 2022-9-8 09:57
都有源码了,按内网机子的内核版本制作一个docker镜像不是更简单?
有些程序想改成全静态链接还真不算好 ...
直接装个和内网机器一样版本的系统编译,或者做成sysroot用来编译,依赖的deb或者rpm什么的也拷贝到内网机器,感觉更简单
静态编译主要是有很多机器都不知道是什么版本的时候方便一点,当然有时候没法这么搞,比如说依赖X11什么的,或者依赖系统locale、NSS之类的,需要能被hook的时候 用static build
—— 来自 samsung SM-N9860, Android 12上的 S1Next-鹅版 v2.5.2-play 你开发机和内网机版本一致吗,我之前遇到类似的问题是内网机ubuntu18,开发机ubuntu14,18里废弃了几个lib,另外很多软连接的东西不不确认就直接用zip打包的话,软连接也会失效
页:
[1]