移植openssl至嵌入式linux编译工具链

本文分享了一次在使用arm-linux编译工具链时遇到OpenSSL工具缺失的问题,并详细记录了从官网下载源码、配置编译参数、完成编译安装的全过程。通过自行编译,成功解决了NTP服务的依赖问题。

在编译ntp服务的时候,发现arm-linux编译工具链下没有openssl工具,便自己编译了一下,分享一下。

1. 官网下载源码:http://www.openssl.org/source/

2. 编译:

# tar -xvf openssl-0.9.8zf.tar.gz
# cd openssl-0.9.8zf
# ./Configure no-asm shared --prefix=/Software/arm-jyxtec-linux-gnueabi/arm-jyxtec-linux-gnueabi/ os/compiler:arm-linux-gcc
# make && make install
即成功了。


将 Visual Studio (VS) 项目移植ARM 嵌入式 Linux 平台,通常意味着你需要将原本在 Windows 上使用 MSVC(Microsoft Visual C/C++ Compiler)编译的 C/C++ 项目,迁移到基于 ARM 架构的嵌入式 Linux 系统中,并使用交叉编译工具链(如 GCC)进行构建。 这个过程涉及多个步骤:代码兼容性调整、构建系统重构、交叉编译、目标平台部署与调试等。下面我将详细说明整个流程,并提供示例代码和脚本。 --- ### ✅ 步骤一:确认项目类型和依赖 首先判断你的 VS 项目是哪种类型: - 控制台程序?DLL?MFC?Windows API 调用? - 是否使用了 Windows 特有的 API(如 `WinMain`, `CreateFile`, `RegOpenKey` 等)? - 是否使用第三方库(如 Boost、OpenSSL、SQLite)? > ⚠️ **重点**:任何调用了 Windows API 的代码都需要重写或替换为 POSIX/Linux 接口。 --- ### ✅ 步骤二:准备交叉编译环境 你需要一个针对目标 ARM 平台的交叉编译工具链(Cross Compiler),例如: ```bash arm-linux-gnueabihf-gcc --version ``` #### 安装交叉编译器(Ubuntu/Debian 示例): ```bash sudo apt update sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf ``` > 注意:根据你的 ARM 架构选择合适的工具链: > - `arm-linux-gnueabihf`:ARM32 HF(硬浮点) > - `aarch64-linux-gnu`:ARM64(AArch64) --- ### ✅ 步骤三:迁移构建系统(从 MSVC 到 Make/CMake) Visual Studio 使用 `.sln` 和 `.vcxproj` 文件管理项目,但嵌入式 Linux 通常使用 **Makefile** 或 **CMake**。 推荐使用 **CMake**,因为它跨平台且易于交叉编译。 #### 示例:简单 C++ 项目的 CMake 移植 假设你原来的 VS 项目只有一个源文件 `main.cpp`: ```cpp // main.cpp #include <iostream> using namespace std; int main() { cout << "Hello from ARM Embedded Linux!" << endl; return 0; } ``` 创建 `CMakeLists.txt`: ```cmake cmake_minimum_required(VERSION 3.10) project(MyEmbeddedApp) set(CMAKE_CXX_STANDARD 14) # 添加可执行文件 add_executable(main main.cpp) ``` --- ### ✅ 步骤四:配置交叉编译工具链文件 创建 `toolchain-arm.cmake`: ```cmake # toolchain-arm.cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) # 工具链路径(根据实际安装位置调整) set(TOOLCHAIN_PREFIX arm-linux-gnueabihf) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) # 搜索库和头文件时不要去宿主机目录搜索 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) ``` --- ### ✅ 步骤五:交叉编译项目 ```bash # 创建构建目录 mkdir build && cd build # 使用 CMake 配置交叉编译 cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain-arm.cmake # 编译 make ``` 输出将是可在 ARM 设备上运行的二进制文件(如 `main`)。 --- ### ✅ 步骤六:部署到 ARM 嵌入式 Linux 设备 通过 SCP 或串口等方式将可执行文件复制到目标设备: ```bash scp main root@192.168.1.10:/root/ ``` 在目标设备上运行: ```bash chmod +x main ./main ``` 输出应为: ``` Hello from ARM Embedded Linux! ``` --- ### ✅ 步骤七:处理依赖和系统差异 | 问题 | 解决方案 | |------|----------| | 使用了 Windows API | 改用 POSIX(如 `open()` 替代 `CreateFile()`) | | 使用 MFC / Win32 GUI | 移除或改用 Qt/embedded、GTK、LVGL 等嵌入式 GUI 框架 | | 第三方库未编译ARM | 需要交叉编译这些库并链接 | | 字节序、数据类型大小不同 | 使用 `stdint.h` 显式定义类型(如 `uint32_t`) | --- ### ✅ 示例:检测平台差异的代码 ```cpp #ifdef _WIN32 #include <windows.h> void sleep_ms(int ms) { Sleep(ms); } #elif __linux__ #include <unistd.h> #define sleep_ms(ms) usleep((ms) * 1000) #endif ``` 这样可以提高代码可移植性。 --- ### ✅ 总结流程图 ``` VS Project (.vcxproj) ↓ 提取源码 + 清理 Windows 依赖 ↓ 编写 CMakeLists.txt ↓ 配置交叉编译工具链 ↓ 使用 CMake + 工具链生成 Makefile ↓ make 编译ARM 可执行文件 ↓ scp 到 ARM Linux 运行 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值