sdk交叉编译

安装squashfs-lzma

分类: linux 901人阅读 评论(1) 收藏 举报

LZMA is one of the best compression algorithms and Squashfs is one of the best compressed filesystems available nowadays. This project combined both to make something even better. 

LZMA can compress much better then gzip, which was the only option in squashfs for years. Compressing to LZMA format is very slow, but this is not a problem as the squashfs filesystem needs to be compressed only once. Then it's only read million times; so what we care about is the speed of decompression. LZMA decompression is slower than gzip, but it's even very fast, about 10-20 MB/s on a 2GHz CPU. 


解压后直接make,但是安装的时候碰到一个问题

  1. /usr/bin/ld: mksquashfs.o: undefined reference to symbol 'log10@@GLIBC_2.0'  
  2. /usr/bin/ld: note: 'log10@@GLIBC_2.0' is defined in DSO /lib/libm.so.6 so try andding it to the linker command line  
  3. /lib/libm.so.6: could not read symbols: Invalid operation  
/usr/bin/ld: mksquashfs.o: undefined reference to symbol 'log10@@GLIBC_2.0'
/usr/bin/ld: note: 'log10@@GLIBC_2.0' is defined in DSO /lib/libm.so.6 so try andding it to the linker command line
/lib/libm.so.6: could not read symbols: Invalid operation
这是由于编译的时候没有链接math库。

追踪溯源,找到了“squashfs3.2-r2/squashfs-tools”目录下Makefile文件,在

  1. mksquashfs: LDLIBS += -lpthread -lunlzma_r -llzma_r -lstdc++  
mksquashfs: LDLIBS += -lpthread -lunlzma_r -llzma_r -lstdc++
后面加上 -lm

然后编译,就通过了

### 阿里云 SDK 交叉编译的使用方法与配置步骤 阿里云 IoT SDK 支持多种嵌入式设备上的开发需求,因此通常需要对其进行交叉编译以适配不同的硬件平台。以下是针对阿里云 SDK交叉编译过程及相关配置步骤的详细介绍。 --- #### 1. 环境准备 在开始交叉编译前,需确保以下条件满足: - 安装好目标平台对应的工具链(如 ARM 工具链),例如 `arm-linux-gcc` 和 `arm-linux-ar`。 - 下载并解压阿里云 IoT SDK 源码包[^3]。 - 创建工作目录,并准备好所需的 Makefile 或构建脚本模板。 --- #### 2. 修改编译器设置 为了适应不同目标平台的要求,需要调整 SDK 中默认使用的编译器和链接器。具体操作如下: ##### (1)修改编译器变量 打开 SDK 源码根目录下的 `platform_config.mk` 文件,找到以下两行内容并将它们替换为目标平台的工具链命令: ```makefile PLATFORM_CC := arm-linux-gcc # 替换原有的 gcc PLATFORM_AR := arm-linux-ar # 替换原有的 ar ``` ##### (2)确认头文件路径 确保 `-I` 参数指向正确的标准库头文件位置,尤其是当目标平台上存在特定版本的标准库时。可以在同一 `platform_config.mk` 文件中添加类似以下内容: ```makefile INCLUDE_PATHS += /path/to/target/include LIBRARY_PATHS += /path/to/target/lib ``` --- #### 3. 编译 HAL 层模块 HAL(Hardware Abstraction Layer)层是阿里云 SDK 中负责底层硬件交互的部分。对于某些特殊场景,可能需要单独编译这部分代码并与主程序动态或静态链接。 ##### (1)选择要编译的 HAL 文件 根据实际需求挑选所需的功能模块源文件,常见的有以下几个: - `HAL_OS_linux.c` - `HAL_TCP_linux.c` - `HAL_UDP_linux.c` 将这些文件复制到一个新的子目录中,例如 `hal_src/`。 ##### (2)生成静态库 利用修改后的工具链重新编译上述 HAL 文件,最终打包成一个 `.a` 格式的静态库 A。执行以下命令完成此步: ```bash mkdir build && cd build arm-linux-gcc -c ../hal_src/*.c -o hal.o arm-linux-ar rcs libhal.a hal.o ``` --- #### 4. 主工程集成与测试 完成 HAL 层的预处理后,回到主项目的构建阶段,按照正常流程继续进行整个 SDK 的编译。 ##### (1)更新依赖关系 进入 `output/release/src` 目录,编辑现有 Makefile 并加入刚才生成的静态库路径及名称: ```makefile LDFLAGS += -L/path/to/static/libs -lhal ``` ##### (2)运行编译指令 启动完整编译过程,此时会自动拉取所有必要组件并尝试组合成可执行文件或共享库: ```bash cd output/release/src make clean make all ``` 如果一切顺利,则会在当前目录下看到最终产物;若有报错,请仔细核对每一步骤中的参数设定是否正确。 --- #### 示例代码片段 下面给出一段简单的样例演示如何加载外部资源并初始化网络连接部分: ```c #include "iot_import.h" #include "iot_export.h" int main(void) { int rc; // 初始化日志系统 iot_log_init(IOT_LOG_LEVEL_INFO, NULL); // 设置云端服务器地址及其他选项 char product_key[] = "YourProductKey"; char device_name[] = "YourDeviceName"; char device_secret[] = "YourDeviceSecret"; IOT_CTX ctx = {0}; memset(&ctx, 0x00, sizeof(ctx)); ctx.product_key = product_key; ctx.device_name = device_name; ctx.device_secret = device_secret; // 开始建立 MQTT 连接 rc = IOT_MQTT_Construct(&ctx); if (rc != SUCCESS_RETURN) { printf("Failed to construct mqtt connection!\n"); return -1; } while(1){ sleep(1); } } ``` --- #### 注意事项 - **兼容性校验**:务必提前验证所选工具链能否完全支持目标芯片架构及其特性集。 - **调试手段引入**:考虑到嵌入式环境中难以直接观察内部状态变化,建议启用远程 GDB 调试模式辅助定位问题所在。 - **性能优化考量**:视具体情况裁剪不必要的功能分支,减少镜像体积的同时提升响应速度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值