C 语言开发后的软件如何分发?

2021-03-08 10:42:58 +08:00
 SystemLight
4453 次点击
所在节点    C
36 条回复
dorothyREN
2021-03-08 10:53:30 +08:00
交叉编译
pursuer
2021-03-08 10:55:26 +08:00
1 、没 wine 这样的模拟不行
2 、可以
3 、可以,但是平台很多,你需要编译出很多个版本,对应各种 CPU,ABI 和操作系统,如果动态链接了其他库 glibc 等,你可能还会碰到这些库的版本问题。。
afirefish
2021-03-08 11:09:54 +08:00
建议 docker
nightwitch
2021-03-08 11:12:18 +08:00
1. 直接编译不可以,交叉编译可以
2. 如果你有交叉编译工具链,那么可以在本机编译,目标主机运行
3. 可以,但是需要很多 C 语言语法之外的知识,包括静态链接和动态链接,目标系统的 ABI 和目标平台的 CPU 架构和指令集等,并且最好需要你有目标平台的机子测试。
northisland
2021-03-08 11:14:12 +08:00
没有按照跨平台方法弄出来的 c 程序,要搞成跨平台,多半有很长的路。

看楼主的问题,感觉是从 0 开始。建议找个专门弄 c / c++的来弄这个吧。
qzhsjz
2021-03-08 11:20:51 +08:00
如果你的需求仅仅在于 Windows 和 Linux 跨平台的话,那么你可以在 Windows 上使用 Linux 的工具链进行开发。如 CygWin 或 WSL 等。并且编译后的程序,如果是完全静态编译的话,理论上应该是可以在和 Windows 同架构的纯 Linux 系统上直接运行的。
但是你的需求如果涉及到其他方面,比如你在 Windows 上搞开发,但目标机器是个 ARM 或者 MIPS 或者 RISC-V 之类的,那么你在 x86 的 Windows 开发机上写程序测试倒是没有问题,但是最终运行是一定要想办法编译一个目标机器的版本才可以,也就是楼上们说的交叉编译。
nevin47
2021-03-08 11:21:41 +08:00
LZ 的问题看上去对编译和 C 语言都不熟悉,建议看看基础的内容,或者找懂得人手把手教一下
misaka19000
2021-03-08 11:21:55 +08:00
交叉编译可以直接扔到 CI 平台去做吧?
QBugHunter
2021-03-08 11:27:21 +08:00
1. 可以,但除非有决定的必要,否则这是给自己找麻烦,C/C++讲究的是一次编写,到处编译,而不是一次编译,到处运行。交叉编译一般是因为目标机器缺乏编译环境(通常是嵌入式设备)

2.可以

3 同 1,可以,但除非有绝对的必要(如目标机器缺乏编译环境,锻炼自己交叉编译水平),否则不要这么干
pkookp8
2021-03-08 12:02:49 +08:00
@QBugHunter 我觉得你说的 1 不对,64 位机编译同 cpu 的 32 位程序,你能说你缺少编译环境(硬件)吗
如果你有一份源码,需要编译出 4-5 个平台的软件。

最方便的应该是配置一套编译环境,编译 4-5 种软件
而不是部署 4-5 个平台,clone 4-5 次代码,再去编译自己的软件

@misaka19000
CI 本质还是你写的脚本吧,当然可以交给 CI
shuax
2021-03-08 13:03:34 +08:00
建议改成 golang
3dwelcome
2021-03-08 13:17:44 +08:00
@pkookp8 Cross-Compile 没那么完美,我就遇到过 ffmpeg 编译 elf 的时候,遇到文件句柄管道重定向的问题。可能和交叉编译工具链里面的链接库有关系,但是问题查起来就很复杂。
简单的多平台算法移植,可能没问题。因为依赖库很少。
ch2
2021-03-08 13:20:16 +08:00
一次编写到处运行,仅限于脚本
C 语言是多次编写,多次编译,针对每个具体的目标版本都要有不同的处理
Jirajine
2021-03-08 13:22:55 +08:00
工具链用这个 musl.cc 一般用来编译其他语言的 c 依赖。
当然依赖管理和 build system 要自己处理。
SystemLight
2021-03-08 14:53:02 +08:00
@afirefish 但是是一个 GUI 软件,用 docker 可以把 GUI 界面显示到宿主机上么
afirefish
2021-03-08 15:34:12 +08:00
@SystemLight 这就涉及我的知识盲区了,如果是无 GUI 的话,docker 是可行的。不是无 GUI 的,还是交差编译各个平台的吧。
AndyAO
2021-03-08 16:48:28 +08:00
无论什么语言,要做跨平台,比较轻松的方法就是从最初就是做,否则的话会蹩脚不堪[^1],甚至不如推倒重来。当然重来不意味着,之前做的工作全部都要重复,毕竟还有很多的设计思想和模式,甚至很多的代码段可以直接用。[^2]

[^1]: PETERSEIBEL. 编程人生:15 位软件先驱访谈录[M]. 人民邮电出版社, 2011.

如果你打算发布跨平台产品,历史会告诉你绝不要抱着“以后再移植”这样的想法。真想做到跨平台的话,就必须同时开发。所谓的移植只会令产品在第二平台上蹩脚不堪。 —— Jamie Zawinski

[^2]: 格拉斯. (2006). 软件工程的事实与谬误 = Facts and fallacies of software engineering. 中国电力出版社.

到目前为止,有关复用的讨论都相当让人失望。小规模复用已经有超过 45 年的历史了,其中的问题已经得到很好的解决。大规模复用问题似乎难以解决,只不过对于相似的问题有一点希望。修改可复用组件通常非常困难,不是一种非常好的方法。那么,当程序员面对一个新问题时,如何能避免彻底从头再来?软件实践者常用的方法之一是根据以往问题的处理方法来解决当前的问题。
linusyang
2021-03-08 17:08:52 +08:00
C 语言一次编译到处运行?当然可以!🤪

https://github.com/jart/cosmopolitan
https://news.ycombinator.com/item?id=25556286
https://justine.lol/ape.html

实验性质的 libc,可以生成 Windows 可执行的 PE 格式二进制,在 unix 上借助 shell 跨平台。
UserDMM
2021-03-08 17:18:09 +08:00
@SystemLight
要到到处都可以编译和运行
首先,要用跨平台编译编译工具,如:CMake,QMake 这类
其次,代码也要还是跨平台的,不能用单个平台私有的 API,跨平台的库很多,boost,qt 等
最后,祝你好运!
helloworld2076
2021-03-08 18:39:11 +08:00
感觉楼主经验为 0,还是和领导说下,招个人吧。
也算增加了一个就业岗位。

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

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

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

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

© 2021 V2EX