注意: 本文內容于 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
。