4、开发环境搭建:Windows/Linux/macOS下的依赖安装、编译配置、CMake集成

做密码SDK,第一关不是写代码,而是搭环境。

我见过太多新手,卡在“编译不过”上。其实多半不是代码的问题,是依赖没装全,或者CMake找不到库。

这一节,我就把三个主流平台的环境搭建捋一遍。你跟着做,基本不会翻车。

4.1 跨平台密码库的依赖分析

我们的SDK核心依赖就三样:

  • OpenSSL — 提供底层密码算法(AES、RSA、哈希等)
  • CMake — 跨平台构建工具
  • 编译器 — Windows用MSVC(Visual Studio),Linux/macOS用GCC或Clang

另外,如果你要跑测试,还需要Google Test。不过测试环境咱们后面再聊。

为什么强调“跨平台”?说白了,密码SDK的客户可能用Windows服务器,也可能用Linux嵌入式设备。你写代码时如果只在一个平台调通过,换到另一个平台就容易炸。

我记得有一次,同事在Windows上用的OpenSSL 1.1.1,没注意路径问题,结果Linux编译时死活找不到头文件。嗯,这种坑咱们要提前避开。

4.2 Windows环境搭建

Windows下我推荐两种方式:

  • vcpkg(微软的包管理器)
  • 手动下载预编译库

我个人习惯用vcpkg,因为它能自动集成CMake,省掉很多手动配置的功夫。

4.2.1 安装CMake

  1. 从 cmake.org 下载 Windows 安装包(msi或zip)。
  2. 安装时勾选“Add CMake to the system PATH”。
  3. 打开命令行,输入 cmake --version 验证。

4.2.2 安装OpenSSL(vcpkg方式)

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install
.\vcpkg install openssl-windows:x64-windows

等几分钟,搞定。之后CMake就能自动找到OpenSSL。

4.2.3 手动安装OpenSSL(备选)

如果你不想用vcpkg,也可以去 slproweb.com/products/Win32OpenSSL.html 下载预编译的Windows版OpenSSL。安装后记得设置环境变量:

set OPENSSL_ROOT_DIR=C:\Program Files\OpenSSL-Win64

我曾经遇到过一个坑:Windows上OpenSSL的lib文件名是 libcrypto.lib、libssl.lib,而Linux下是 libcrypto.a。CMake脚本里如果硬编码成 .a 就完蛋。所以后面咱们用 find_package 自动处理。

4.3 Linux环境搭建

Linux就简单多了。包管理器直接搞定一切。

4.3.1 Ubuntu/Debian系列

sudo apt update
sudo apt install build-essential cmake libssl-dev

你想想看,一行命令就把编译器、CMake和OpenSSL头文件都装上了。舒坦。

4.3.2 CentOS/RHEL/Fedora系列

sudo yum groupinstall "Development Tools"
sudo yum install cmake openssl-devel

注意:某些老旧CentOS的CMake版本可能太低(< 3.10),不支持某些语法。我建议你去CMake官网下载预编译二进制,或者用pip安装:

pip install cmake

4.3.3 Alpine Linux(小型容器常用)

apk add build-base cmake openssl-dev

嗯,这里要注意:Alpine默认使用musl libc,有时候OpenSSL的pthread行为跟glibc不一样。如果你的密码库用了多线程,建议在Alpine上多测一轮。

4.4 macOS环境搭建

macOS最推荐用Homebrew。Xcode Command Line Tools也是必须的。

4.4.1 安装Xcode Command Line Tools

xcode-select --install

会弹出窗口,点击“安装”就行。之后再装Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

4.4.2 安装依赖

brew install cmake openssl

Homebrew会把OpenSSL安装到 /usr/local/opt/openssl,CMake通常能自动找到。但我也遇到过 find_package(OpenSSL) 找不到的情况。那时需要手动设置:

export OPENSSL_ROOT_DIR=/usr/local/opt/openssl

我个人习惯在 ~/.zshrc 里加上这一行,省得每次都要export。

4.5 CMake集成:通用模板

好,环境装好了,怎么写CMakeLists.txt呢?

下面是我自己项目里一直在用的模板,兼容三个平台:

cmake_minimum_required(VERSION 3.10)
project(MyCryptoSDK VERSION 1.0.0 LANGUAGES C CXX)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

# 查找OpenSSL
find_package(OpenSSL REQUIRED)
if(OpenSSL_FOUND)
    include_directories(${OPENSSL_INCLUDE_DIR})
    message(STATUS "OpenSSL found: ${OPENSSL_VERSION}")
else()
    message(FATAL_ERROR "OpenSSL not found. Please install it.")
endif()

# 添加自己的源文件
add_library(cryptosdk
    src/aes.c
    src/rsa.c
    src/hash.c
    src/utils.c
)

target_link_libraries(cryptosdk PRIVATE OpenSSL::SSL OpenSSL::Crypto)

# 可选:添加测试
enable_testing()
add_subdirectory(tests)

为什么用 OpenSSL::SSL 和 OpenSSL::Crypto?这是CMake的现代方式,能自动传递头文件路径和链接库。以前我用 target_link_libraries(cryptosdk ${OPENSSL_LIBRARIES}),结果在macOS上因为OpenSSL路径不标准,经常编译报错。后来改用IMPORTED target,问题就解决了。

另外,如果你的SDK需要支持静态编译(例如给嵌入式设备用),可以加一个选项:

option(BUILD_STATIC "Build static library" OFF)
if(BUILD_STATIC)
    add_library(cryptosdk STATIC ...)
else()
    add_library(cryptosdk SHARED ...)
endif()

4.6 一张图看懂环境搭建流程

我把整个环境搭建的依赖关系画出来了,你一看就明白:

环境搭建依赖关系图 开发环境搭建流程与依赖关系 Windows Linux macOS vcpkg / 手动安装 apt / yum / apk Homebrew CMake 构建工具 OpenSSL 密码库 CMakeLists.txt 可编译的密码SDK

流程很简单:先选平台 → 用对应包管理器装CMake和OpenSSL → 准备CMakeLists.txt → 编译。关键是把OpenSSL的路径正确传给CMake。

4.7 避坑指南与提示

个人小技巧:在每个平台的根目录下放一个 CMakePresets.json,可以保存不同配置。比如 Windows 用 vcpkg 预设,Linux 用系统预设。这样你切换平台时只需 cmake --preset=windows 就行。

我曾经遇到的重大翻车现场:在公司一个嵌入式Linux项目上,板子用的OpenSSL 1.0.2,但是开发机装了1.1.1。结果编译链接时因为ABI不兼容,程序启动就段错误。那之后我再也不偷懒,每次都为交叉编译目标单独指定 CMAKE_PREFIX_PATH。

核心检查清单:

  • 编译器已安装(gcc/clang/MSVC)
  • CMake 版本 ≥ 3.10
  • OpenSSL 开发库已安装(包括头文件)
  • 环境变量 OPENSSL_ROOT_DIR 指向正确路径(macOS/Windows特别需要)
  • 执行 cmake -B build 无错误
  • 执行 cmake --build build 生成成功

你只要按这个清单过一遍,环境搭建这一关就稳了。后面写代码时,你会发现所有痛苦都提前解决了。