关于 Linux 编译生成可执行文件后打包移植的问题

2022-11-03 15:54:11 +08:00
 yang3121099

各位大哥好,我是大数据和人工智能方向研一在读,项目要用到一个 Github 工具进行数据预处理,应该是和 C 语言编译相关的,了解不多,想请教各位大哥

问题是这样的

github 下载以后需要编译生成可执行文件,目前也可以正常使用,但是我需要把它移植到另一个服务器上,新的服务器是学校提供的华为云,并没有 sudo 权限,很多 apt-get 命令应该无法安装,所以想请教一下这种情况下是否有办法打包封装移植呢,就像 Windows 下面 c 语言生成 exe 文件这种拿走就用

我搜索了一些网页但是没有这方面的介绍,我猜测是必须在每一个新的环境里面配置后重新编译生成才行吗,否则 github 直接给一个可执行的包不就行了哈哈哈

但是也感觉如果变成一个二进制文件,是否能脱离依赖进行运行呢?那如果不行的话,有没有绕过 sudo 权限的方法啊,我看华为云有一个自定义镜像绕过 apt-get的方法,但是也不知道行不行,没有实际部署的经验,特来请教,谢谢各位大哥

参考的链接如下:Github

2613 次点击
所在节点    Linux
29 条回复
yanqiyu
2022-11-03 15:59:10 +08:00
选择基本上有:
- 容器化
- Appimage
- 除了 libc 尽可能静态链接 (比如 vscode 的二进制分发)
- 带一个 prefix ,带着库打包,设置环境变量或者 rpath 来运行
ysc3839
2022-11-03 16:06:48 +08:00
依赖库都别用系统的,自己编译链接,可以静态链接,也可以 so 一起打包带走。
其实跟 Windows 下的区别就是谁来提供这些库,Windows 和 macOS 的惯例是各种依赖库都由程序自己打包。
tool2d
2022-11-03 16:10:07 +08:00
具体看依赖库了,一般简单的 C 程序,跨 linux 几个版本运行都可以。

实在不行你本地安装一个和服务器环境一模一样的虚拟机,本地编译 elf 后再上传也行。

唯一的问题是如果 AI 的话,肯定和 python 相关,如果是用 python setup 之类编译的 so ,那就和 py 运行版本直接绑定了。
yyttrr
2022-11-03 16:18:43 +08:00
随便找个星星多的项目,release 里面都会同时提供多个平台的包
amd64 arm64 windows darwin 等等
通过 cicd 解决吧,多编译出来不同环境的二进制包
libook
2022-11-03 16:20:44 +08:00
程序可能会依赖系统的内核 API 、安装的动态链接库 API 。
Windows 下面涉及到动态链接库可能也不是拿走就能用的。
大部分程序使用的是内核的通用 API ,一般只需要注意平台一样就可以,比如 x86-64 平台之间大多是兼容的。
动态链接库如果目标系统上没有装,你就得跟应用程序一起带过去(包括动态链接库所依赖的其他动态链接库),然后好像可以使用 LD_LIBRARY_PATH 环境变量添加你的库所在的位置。我没试过,你可以探索一下。
weidaizi
2022-11-03 16:20:48 +08:00
#1 @yanqiyu 基本答完了,我补充一个注意事项:当选择 3 ,4 的时候,要注意一下 libc 的版本,保证编译机器上的版本 <= 生产环境的版本
ysc3839
2022-11-03 16:22:39 +08:00
看了下你给的自定义镜像的链接,好像就是弄个 Docker 镜像?那弄一个试试就知道了。
ch2
2022-11-03 16:33:45 +08:00
容器是最稳的,裸而且大的二进制没啥意义
dynos01
2022-11-03 16:37:13 +08:00
针对这样的情况首先考虑静态编译吧,用 musl 。这样正常情况下都能满足你的需要。 以下是参考命令:
'''
git clone --recursive https://github.com/CESNET/nemea
./bootstrap.sh
CC="musl-gcc -static" ./configure --enable-repobuild --prefix=/usr --bindir=/usr/bin/nemea --sysconfdir=/etc/nemea --libdir=/usr/lib64
make
'''
我没有自己测试,但正确安装 musl 后应该能跑通。这样得到的二进制基本上跨平台都没问题。
dynos01
2022-11-03 16:37:42 +08:00
s/静态编译 /静态链接,手滑了
churchill
2022-11-03 16:46:11 +08:00
felixlong
2022-11-03 16:49:44 +08:00
你这个程序本身看上去就需要 root 权限来运行。还是想办法拿到 root 权限吧。
yang3121099
2022-11-03 16:55:57 +08:00
谢谢各位大哥,我大概明白了

就是把现有的 prefix 和 so 库也复制过去然后改 path
或者直接全改成静态链接+通用的 libc 直接拿去就用

我也去了解一下 docker ,以前只听在鹅厂实习的师兄提过是为了提交的代码安全什么的,但我也不知道是啥,感觉挺高级的,之前印象中一直觉得 docker 就是 mac/linux 的任务栏哈哈哈

之前学的 c 语言都是点击自动 compile-run 的,帖子里的这几个名词我慢慢去看,现在进行的 AI 训练模型也是,整天看论文看数学公式然后代码改几行,就丢给显卡看学习曲线,更基础一些的编程原理就啥也不知道了,感觉根基多少不太牢

如果必须 sudo 的话只能两个服务器了,因为需要新的环境提供显卡资源

多谢各位的回复

@yanqiyu
@ysc3839
@tool2d 确实 最后要转到 python 怎么把深度学习的模型打包是我的下一个问题哈哈哈
@yyttrr
@libook
@weidaizi
@ch2
@dynos01
@churchill
@felixlong
microxiaoxiao
2022-11-03 16:55:57 +08:00
静态编译最靠谱,ABI 不变就能运行,注意华为的是不是 arm 的。动态库都有可能有兼容性问题
yang3121099
2022-11-03 16:57:13 +08:00
@microxiaoxiao 好的 我先试一下静态编译,然后学一下 docker 吧,这个 so 看起来考虑的因素有点多哈哈哈
julyclyde
2022-11-03 17:46:22 +08:00
@weidaizi 不是简单的小于等于版本的问题。兼容也是有一定范围的不是无限的
julyclyde
2022-11-03 17:46:48 +08:00
@yang3121099 容器也需要 root 权限

别听鹅厂的人吓咋呼,技术差得很
hsfzxjy
2022-11-03 17:49:01 +08:00
exodus 可以试试
kenvix
2022-11-03 18:32:55 +08:00
容器化也得先用 root 装个容器 runtime 啊
ferstar
2022-11-03 19:07:35 +08:00
炼丹童子啊,conda 了解下

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

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

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

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

© 2021 V2EX