登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: 开源 C 语言项目编译知识 -- 我知道的那部分收集     [回主站]     [分站链接]
标题
开源 C 语言项目编译知识 -- 我知道的那部分收集
clq
浏览(437) + 2020-12-05 23:13:01 发表 编辑

关键字:

[2023-11-28 17:59:14 最后更新]
开源 C 语言项目编译知识 -- 我知道的那部分收集

对以下经验进行了总结,给出一个自己在用的开源 C 语言项目编译方法合集.在
"c语言项目编译总结[目录]"
http://newbt.net/ms/vdisk/show_bbs.php?id=A4C86AE2FC6EF19EAA52ABF801926B0B&pid=182

---------------------------------------------------------------

说来惭愧,我入行二十年,写 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

实际上 MinGW 的故事还要更复杂。实际上 MinGW 据说因为长久不更新被新项目 MinGW64 (http://www.mingw-w64.org)代替了。
等等,这还不是终点,据说...不知道什么原因,现在很多时候又补 tdm-gcc (https://jmeubank.github.io/tdm-gcc/)代替了。

另外,下面要说到的 msys2 就是和 MinGW64 一起的。而原来的 msys 就是 MinGW 附带开发出来的。

2.开源世界有时候真的很自由随意,很多时候编译是要与 linux 的 shell 命令混合的。因为他们用了很多 linux 的 shell 命令来修改和组织 C 语言的代码。这种做法 ... 算了,总之为了满足这种需求很多开源项目几乎是必须还要有兼容 linux 的 shell 存在。这就是 Msys 和 cygwin 和作用,这两者是不同的东西,另外好像还有个叫 msys2 的东西,它又和 msys 是完全独立的另外一个项目...

“..Msys这个模拟unix的shell,可以解决很多的问题,不过没有cygwin好用...”

另外听说用 cygwin 编译出来的东西会带一个 cygwin 的 dll, 是不太合适的 -- 如果您介意的话。

3.编译代码时可怕的路径问题。
最好是先使用
set path=
设置为全空白,然后手工指定各个路径最好。特别是要 vc 参与的命令行编译,更是灾难。

4.编译的目标目前已经分成很多种,传统分为 32 位和 64 位。32 位一般称做 i386 现在还常用 i686 -- 特别是在 linux 下。
这个区分的名称其实也有点混乱。在早期 x86_64 这是指的 32 位,amd64才是说的 64 位。但现在 x86_64 反而指的是 64 位 pc 版本了。

5.如今的 windows 下的 gcc 编译环境还是有巨大进步。估计很多老油条不知道,如今的 MinGW64 发展而来的 msys2 系统几乎是将 windows 变成了一个独立的 linux 发行版本。
如果你能正确的安装好 msys2 的话,那真的是很好用。不过这玩意的安装至少到如今仍然是有问题的。我最近的一次安装碰到过两个错误:一个是到一半时的卡死,这个好办,按网友的说法断网后重启安装即可。
另外一个是安装软件时的证书错误,这个就复杂了,不过按网友的文章安装一堆东西后也还可以过,建议参考
http://newbt.net/ms/vdisk/show_bbs.php?id=4388E94AC94CA48723F5E458F89AD76D

最重要的是,这个 msys2 是通过网络安装的。必须强烈建立大家换成清华的源。https://mirror.tuna.tsinghua.edu.cn/help/msys2/
http://newbt.net/ms/vdisk/show_bbs.php?id=327DF202F879EE8BE81853C3D962417A&pid=160
我忘记自己的 mysys2 是哪里下载的了, https://www.msys2.org/ 这里应该是官方。

6.不知为何,现在 centos 的 mingw/mingw64 的开发包都没有了,连 epel 中都没有。
这是为何?

7.xcode 12.3 下必须要用 -isysroot 参数
编译为 ios 的跨平台版本时目前必须设置这个参数为正确的路径
http://newbt.net/ms/vdisk/show_bbs.php?id=B5CAFF0E0DDBB146ED0DE772982F3265&pid=164

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 芯片的模拟器库的方法和坑

这个文章比较重要的,网络上其他地方都没说到过。




总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录
ffmpeg 更多
开源项目编译合集 更多
ios编译专题 更多
xcode编译专题 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1