注意: 本文内容于 2025-07-20 01:58:56 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:大白编译——autotools与cmake。感谢您的关注与支持!
之前记录了通过autotools编译rpm包与deb包的步骤。参考小白编译——rpm包与deb包 - 言成言成啊
一、跨平台编译
1.1 背景
本节参考
- Autotools Tutorial
- Using GNU Autotools:强烈建议亲自阅读一遍,可以借助AI学习
1.1.1 跨平台困扰
在C中,头文件(.h)只负责“声明”,具体的实现放到**“库文件"里。不同系统"库文件”**示例如下
- 静态库
- Linux: libc.a
- Windows: format.lib
- 动态库
- Linux: libc.so
- Windows: msvcrt.dll
C语言跨平台时不兼容的主要来源
- 函数不存在
- 如
strtod()
,为C标准库函数,但是老版libc
根本没有对应实现
- 如
- 函数有不同的名字
strchr()
vsindex()
,strchr()
为C标准库函数,但是在老版libc
只有index()
,两者作用相同。
- 原型差异
- 老系统只有
int setpgrp(void)
,新系统只有int setpgrp(int,int)
。
- 老系统只有
- 行为差异
malloc(0)
返回值不确定。
- 所在库不同
pow()
的实现可能在libm.so
或libc.so
。
- 头文件差异
- 历史原因,有些系统会针对头文件进行补充,导致其他平台没有。
1.1.2 解决办法
如何实现一个可移植的软件包?让同一份源代码能在不同系统上无修改地编译、运行。
三种应对办法
- 大量
#if/#else
→ 代码凌乱,不推荐。 - 替换宏(
#define fseeko ...
)→ 推荐。 - 替换函数(提供缺失函数的兼容实现)→ 推荐。
替换宏示例,来自 coreutils-5.2.1
的 system.h
。