说来惭愧,我入行二十年,写 C/C++ 也二十年。自认是 C 老油条,没想到最近编译 ffmpeg 时又双叕学到了不少 C 语言的知识,特别是多平台和跨平台方面的。这才发现自己真孤陋寡闻 ... 惭愧,惭愧。所以必须记录一下,当然也顺便教育一下和我一样孤陋寡闻的同行们。
1.在 linux 下使用 gcc 编译出来 windows 下的可用代码时并不是用的"真正"的 gcc !!! 这个问题,我其实也还没有搞清楚,而且还有点糊涂了。我一直以为 linux 用 gcc 可以编译出所有平台下的代码的 -- 这就是所谓的交叉编译。 我虽然不是嵌入式工程师,但也编译过不少 arm 机器上的代码啊。我记得就是直接用的 gcc 啊,好吧,好久以前的事了,以后再证实吧。 先说我今天碰到的事,我的目标是写一个函数编译成 a 静态库,写是很容易的,编译也很容易,但放到 windows 下的 "gcc" -- 我用的 devc++(wxdev) 自带的编译。这个编译器肯定是没问题的,我很多年来一直用来交叉编译出 linux 下的 C 代码,甚至能完美的与 golang 配合。
但是很遗憾的是,centos7 自带的 gcc 编译出来的 a 文件无法正确地导出函数 -- 虽然编译链接 link 这个 a 静态库时并未报错。
我查阅了一下资料才知道,linux 下要交叉出 windows 下的文件也是要安装 MinGW 编译器的! 我之前一直以为 gcc 移植到 windows 下叫做 MinGW ,没想到它是一个独立的产品!!!
-------- 很多网友应该也不知道这个知识,大多介绍 MinGW 都说成是 windows 下的 gcc 。但是只要大家找任何一篇在 linux 下编译出 windows 的 ffmpeg 的文章就会看到它是要求先安装 MinGW 的... 比如这篇 https://blog.csdn.net/yongche_shi/article/details/29250953
8. 可以研究一下 google 的 bazel 基本上都包括了这些情况。不过 bazel 在 tensorflow 这样的项目中是要指定两套平台编译环境的,原因是它要用其中一个作为本地编译环境来生成它 google 的一个通讯协议 c 文件源码!! 所以说不要以为 google 做的就很什么,其实有很多无聊的东西。
9. uber 在跨平台编译 golang 的 c 部分时使用了非常新的 zig 语言,目的是将其作为通用的交叉编译环境。而在 uber 的资助下 zig 已经完全兼容 gcc/clang ,是一个非常完美的 c/c++ 编译器。 它目前是用一个 zig 程序来加上参数代替了众多的 cc ar 这些传统的程序.
10. http://newbt.net/ms/vdisk/show_bbs.php?id=E431E3D556092692D2813423AD9C5195&pid=160&html=1 xcode 作为 golang 的 c 语言编译器编译出 m1 芯片的模拟器库的方法和坑