Mac 编译curl

- 当然可以直接拉取 curl 的源码进行编译!这种方法可以让你完全控制编译过程,生成一个支持 arm64 和 x86_64 的通用二进制 libcurl.dylib,以满足你的需求。以下是详细的步骤,适用于你的 M 芯片 Mac。
	
	--- 
	
	1. 准备环境
	
	在开始之前,确保你的 Mac 已经安装了必要的工具:
- **Xcode 和命令行工具**:确保已安装 Xcode,并安装命令行工具:
	
	bash
	
	```
	xcode-select --install
	```
- **Homebrew**(可选):虽然我们直接编译源码,但 Homebrew 可能需要用来安装依赖(如 autoconf、automake 等工具)。
	
	bash
	
	```
	brew install autoconf automake libtool pkg-config
	```
- **Git**:用来拉取 curl 源码。
	
	bash
	
	```
	brew install git
	```
	
	--- 
	
	2. 拉取 curl 源码
- 使用 Git 克隆 curl 的官方仓库:
	
	bash
	
	```
	git clone https://github.com/curl/curl.git
	cd curl
	```
- 切换到最新的稳定版本(可选,推荐):
	查看最新的 tag:
	
	bash
	
	```
	git tag
	```
	
	假设最新的稳定版本是 curl-8_5_0,切换到该版本:
	
	bash
	
	```
	git checkout curl-8_5_0
	```
	
	--- 
	
	3. 配置编译环境
	
	curl 使用 autotools 构建系统,因此需要先生成 configure 脚本。
- **生成 configure 脚本**:
	在 curl 源码目录中运行:
	
	bash
	
	```
	autoreconf -fi
	```
	
	这会生成 configure 脚本。如果遇到缺少工具的错误,可以通过 Homebrew 安装(如 brew install autoconf)。
- **设置编译架构**:
	为了生成支持 arm64 和 x86_64 的通用二进制,需要在配置时指定目标架构。可以通过设置 CFLAGS 和 LDFLAGS 来实现。
	
	--- 
	
	4. 编译支持 arm64 和 x86_64 的通用二进制
	
	为了生成通用二进制,我们需要分别编译 arm64 和 x86_64 版本,然后使用 lipo 工具将它们合并。
	
	步骤 1:编译 arm64 版本
- 创建一个构建目录并进入:
	
	bash
	
	```
	mkdir build-arm64
	cd build-arm64
	```
- 配置编译选项,指定 arm64 架构:
	
	bash
	
	```
	../configure --prefix=$(pwd)/install \
			--with-secure-transport \
			CFLAGS="-arch arm64" \
			LDFLAGS="-arch arm64"
	```
	- --prefix=$(pwd)/install:指定安装路径(这里是 build-arm64/install)。
	- --with-secure-transport:使用 macOS 原生的 Secure Transport 作为 SSL 后端(避免额外依赖 OpenSSL)。
	- CFLAGS 和 LDFLAGS:指定目标架构为 arm64。
- 编译并安装:
	
	bash
	
	```
	make -j$(nproc)
	make install
	```
	
	完成后,libcurl.dylib 会出现在 build-arm64/install/lib/ 目录中。
- 验证架构:
	
	bash
	
	```
	file install/lib/libcurl.dylib
	```
	
	应该显示 Mach-O 64-bit dynamically linked shared library arm64。
	
	步骤 2:编译 x86_64 版本
- 返回上一级目录,创建另一个构建目录:
	
	bash
	
	```
	cd ..
	mkdir build-x86_64
	cd build-x86_64
	```
- 配置编译选项,指定 x86_64 架构:
	
	bash
	
	```
	../configure --prefix=$(pwd)/install \
			--with-secure-transport \
			CFLAGS="-arch x86_64" \
			LDFLAGS="-arch x86_64"
	```
	- 注意:由于你在 M 芯片 Mac 上编译 x86_64,需要确保 Xcode 的工具链支持 x86_64(通常是支持的)。
	- 如果遇到 x86_64 编译失败,可以尝试使用 Rosetta 模拟运行:
		
		bash
		
		```
		arch -x86_64 ../configure --prefix=$(pwd)/install \
							--with-secure-transport \
							CFLAGS="-arch x86_64" \
							LDFLAGS="-arch x86_64"
		```
- 编译并安装:
	
	bash
	
	```
	make -j$(nproc)
	make install
	```
	
	完成后,libcurl.dylib 会出现在 build-x86_64/install/lib/ 目录中。
- 验证架构:
	
	bash
	
	```
	file install/lib/libcurl.dylib
	```
	
	应该显示 Mach-O 64-bit dynamically linked shared library x86_64。
	
	步骤 3:使用 lipo 合并两个版本
- 使用 lipo 工具将 arm64 和 x86_64 版本合并:
	
	bash
	
	```
	cd ..
	lipo -create build-arm64/install/lib/libcurl.dylib build-x86_64/install/lib/libcurl.dylib -output libcurl_universal.dylib
	```
- 验证合并后的文件:
	
	bash
	
	```
	file libcurl_universal.dylib
	```
	
	应该显示支持两种架构:
	
	```
	libcurl_universal.dylib: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
	```
	
	--- 
	
	5. 在 Xcode 中使用编译好的 libcurl_universal.dylib
	
	现在你有了一个支持 arm64 和 x86_64 的 libcurl_universal.dylib,可以将其集成到 Xcode 项目中。
- **复制动态库和头文件**:
	- 将 libcurl_universal.dylib 复制到一个固定的目录,例如 /path/to/your/project/libs/:
		
		bash
		
		```
		mkdir -p /path/to/your/project/libs
		cp libcurl_universal.dylib /path/to/your/project/libs/
		```
	- 复制头文件(从 build-arm64/install/include/ 目录中):
		
		bash
		
		```
		mkdir -p /path/to/your/project/include
		cp -r build-arm64/install/include/curl /path/to/your/project/include/
		```
- **在 Xcode 中添加**:
	- 打开 Xcode 项目。
	- 在 **Build Phases** \> **Link Binary With Libraries** 中,点击 +,选择 **Add Other** \> **Add Files**,添加 /path/to/your/project/libs/libcurl_universal.dylib。
	- 在 **Build Settings** 中,设置 **Library Search Paths**:
		
		```
		/path/to/your/project/libs
		```
	- 设置 **Header Search Paths**:
		
		```
		/path/to/your/project/include
		```
- **验证 Xcode 项目设置**:
	- 在 **Build Settings** 中,确保 **Architectures** 包含 arm64 和 x86_64。
	- 确保 **Build Active Architecture Only** 设置为 No。
- **测试**:
	在代码中包含 curl.h:
	
	c
	
	```
	#include \<curl/curl.h\>
	```
	
	编译并运行项目,确认没有链接错误。
	
	--- 
	
	6. 其他注意事项
- **依赖问题**:如果你需要使用其他 SSL 后端(如 OpenSSL),需要在 configure 时指定:
	
	bash
	
	```
	--with-openssl
	```
	
	但需要先安装 OpenSSL(通过 Homebrew:brew install openssl),并在 configure 时指定路径:
	
	bash
	
	```
	PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@3/lib/pkgconfig" ../configure ...
	```
	
	使用 --with-secure-transport 更简单,因为它使用 macOS 原生的 SSL 库。
- **符号链接问题**:编译完成后,生成的可能是 libcurl.4.dylib 和一个符号链接 libcurl.dylib。如果 Xcode 解析为 libcurl.4.dylib,可以直接使用,或者手动创建一个新的符号链接:
	
	bash
	
	```
	ln -sf libcurl.4.dylib libcurl.dylib
	```
- **运行时测试**:在 M 芯片 Mac 上测试通过后,建议在 Intel Mac 上也测试,确保 x86_64 架构正常运行。
	
	--- 
	
	7. 总结
	
	通过直接从源码编译 curl,你可以完全控制生成支持 arm64 和 x86_64 的 libcurl.dylib。关键步骤是分别编译两种架构的版本,然后用 lipo 合并。编译过程中如果遇到依赖问题(比如缺少工具或库),可以通过 Homebrew 解决。
	
	如果编译过程中有任何错误(比如 configure 失败、链接错误等),可以告诉我,我会帮你进一步排查!