交叉编译的哲学:OpenSSL与cURL如何跨越架构鸿沟?

Linux VPS命令行下载全指南:wget/curl/rsync/aria2实战选型与避坑 在无图形界面的Linux服务器环境中,'下载'并非简单点击动作,而是涉及协议支持、网络可靠性、权限控制与安全校验的系统性工程。理解HTTP/HTTPS、FTP、SFTP等基础传输协议原理,是选择wget(专注稳健下载)、curl(灵活请求控制)、rsync(智能增量同步)或aria2(多线程加速)的前提;其技术价值在于保障大文件断点续传、跨服务器高效同步及自动化脚本集成能力。典型应用场景包括VPS初始化部署、远程备份拉取、CI/CD资源获取及嵌入式固件分发。本文聚焦真实生产环境中的linux vps dow 阅读详情

交叉编译的哲学:OpenSSL与cURL如何跨越架构鸿沟?

在软件工程的发展历程中,我们始终面临一个根本性挑战:如何让同一段代码在不同计算架构上无缝运行?交叉编译作为解决这一问题的核心技术,早已超越了单纯的工具链使用,成为连接异构计算世界的桥梁。尤其在当今边缘计算、物联网和多元硬件生态蓬勃发展的背景下,理解交叉编译背后的设计哲学,比掌握具体操作步骤更具长远价值。

当我们讨论OpenSSL和cURL这样的基础库时,实际上是在探讨软件基础设施如何适应从云端到终端设备的全场景覆盖。这些库不仅需要处理不同指令集和字节序的差异,还要在保持功能一致性的同时,应对性能特征各异的硬件环境。这种跨越架构鸿沟的能力,体现的是软件工程中最深刻的抽象与适配智慧。

1. 交叉编译的技术本质与演进历程

交叉编译并非新鲜概念,其历史可追溯到早期计算机系统的移植需求。当时开发者就意识到,直接在目标硬件上编译软件往往不现实——特别是当目标平台资源受限或尚未完全稳定时。交叉编译的核心思想由此诞生:在一个架构上生成另一个架构的可执行代码。

这种技术路径的选择背后有着深刻的工程考量。首先,开发环境通常比目标环境更强大,拥有更丰富的工具链和调试资源。其次,统一开发环境能显著提升效率,避免为每个目标平台搭建完整的构建系统。最重要的是,交叉编译实现了构建环境与运行环境的彻底分离,这种分离为软件的大规模分发和部署奠定了基础。

现代交叉编译工具链已经发展得极为成熟。以GCC为例,其支持的目标架构超过50种,从常见的x86、ARM到RISC-V、MIPS等小众架构。这种广泛的支持背后是工具链设计的模块化哲学:前端统一处理语言解析和优化,后端针对特定架构生成代码。这种设计使得新增架构支持变得相对简单,只需实现特定的后端模块即可。

在实际应用中,交叉编译面临的最大挑战不是技术实现,而是环境的一致性保证。不同库的依赖关系、编译器标志的细微差异、甚至系统头文件的版本变化,都可能导致交叉编译失败。这正是为什么现代构建系统如CMake、Bazel等都内置了交叉编译支持,通过工具链文件的概念将环境配置封装为可重复使用的组件。

2. OpenSSL的跨架构适配策略

作为密码学和网络安全的基础设施,OpenSSL的跨平台能力直接影响着整个互联网的安全状况。这个拥有数百万行代码的庞大库,如何在保持功能丰富性的同时实现跨架构兼容?其答案在于多层次的设计策略。

配置系统的抽象层设计是OpenSSL跨架构的核心。OpenSSL的配置系统不是简单的预处理器宏集合,而是一个完整的架构描述语言。当运行./config时,系统会检测当前环境并生成相应的Makefile,这个过程涉及数百个环境变量的评估和决策。对于交叉编译,开发者通过--cross-compile-prefix参数提供工具链前缀,配置系统便会自动调整编译策略。

让我们看一个典型的配置示例:

./config no-asm shared no-async \
    --prefix=${PREFIX} \
    --cross-compile-prefix=${CROSS_PREFIX}

这里的每个参数都有其架构适配意义:

  • no-asm禁用汇编代码,因为汇编代码通常高度架构特定
  • shared生成动态库,便于在不同架构间共享
  • no-async禁用异步IO支持,在某些嵌入式平台上可能不兼容

源代码级别的条件编译是另一关键策略。OpenSSL代码库中充满了类似这样的条件判断:

#if defined(OPENSSL_SYS_LINUX) && defined(__arm__)
    /* ARM Linux特定实现 */
#elif defined(OPENSSL_SYS_WINDOWS) && defined(_M_X64)
    /* x64 Windows特定实现 */
#endif

这种条件编译确保了每个平台都能获得最优实现,但同时增加了代码的复杂性。OpenSSL通过模块化设计平衡这种复杂性——将平台相关代码隔离在特定文件中,核心算法保持平台中立。

测试策略的适应性调整同样重要。交叉编译后的库必须在目标架构上进行充分测试,但测试环境往往与开发环境分离。OpenSSL的测试套件支持交叉测试模式,能够在开发机上生成测试用例,在目标机上执行并返回结果。这种分离式测试架构大大提升了交叉编译的可靠性。

3. cURL的多架构协同机制

cURL作为一个网络传输工具库,其跨架构挑战不仅来自底层硬件,还来自网络环境的多样性。从嵌入式设备的受限环境到云服务器的高并发场景,cURL都需要保持一致的行为和接口。

依赖管理的架构感知能力是cURL的核心优势。cURL支持多种后端传输协议(HTTP、FTP、SCP等)和安全库(OpenSSL、GnuTLS等),每个后端都有其架构特定的考量。在交叉编译时,cURL的配置系统会自动检测目标架构的特性,选择最适合的后端实现。

考虑以下配置示例:

CPPFLAGS="-I${SSL_INCLUDE}" LDFLAGS="-L${SSL_LIB}" \
./configure --host=arm-linux \
    CC=${CROSS_CC} CXX=${CROSS_CXX} \
    --with-ssl=${SSL_PREFIX} \
    --enable-shared --disable-static

这个配置过程体现了cURL的架构适配智慧:

  • 显式指定头文件和库路径,解决交叉环境中的依赖查找问题
  • 设置--host参数声明目标架构,触发交叉编译模式
  • 选择共享库而非静态库,减少目标平台的存储占用
  • 禁用不必要的协议(如FTP、IMAP),简化嵌入式版本

传输优化的架构特异性是另一个重要层面。cURL针对不同架构优化了网络传输策略:在高端服务器上启用多路复用和流水线,在嵌入式设备上使用轻量级握手和最小化内存占用。这种优化不是通过硬编码实现,而是通过运行时检测和目标特定的编译选项组合实现。

cURL的生态系统集成策略也值得称道。它不试图解决所有问题,而是提供清晰的接口让开发者根据目标架构选择适当的组件。这种设计哲学使得cURL能够在小到KB级别的嵌入式系统和大到TB级别的云系统中都能有效工作。

4. 工具链设计的哲学思考

交叉编译工具链的设计体现了计算机科学中一些最深刻的抽象原则。一个优秀的工具链不仅仅是编译器的集合,而是一个完整的生态系统,能够在架构差异之上构建统一的开发体验。

抽象层次的分离是工具链设计的核心原则。现代工具链通常分为多个层次:

  • 编译器前端(Clang、GCC):处理语言解析和架构无关的优化
  • 代码生成器:将中间表示转换为目标架构的汇编代码
  • 汇编器和链接器:处理目标文件生成和最终链接
  • 标准库:提供架构特定的运行时支持

这种分离允许每个组件独立演进,同时保持整体的协同工作。当新增一个架构支持时,只需实现相应的代码生成器和标准库,编译器前端可以保持不变。

环境封装的完整性是另一个关键考量。交叉编译工具链必须提供完整的目标环境模拟,包括头文件、库文件和系统调用接口。这就是为什么工具链通常包含sysroot目录——一个包含目标系统完整文件系统结构的目录。这种封装确保了开发机上的构建环境与目标运行环境的一致性。

工具链的可扩展性和可定制性同样重要。不同的应用场景可能需要不同的工具链配置:嵌入式系统需要尺寸优化,服务器系统需要性能优化,实时系统需要确定性行为。优秀的工具链提供模块化配置选项,允许开发者根据具体需求定制工具链行为。

5. 构建系统的架构抽象艺术

构建系统在交叉编译中扮演着关键角色,它们将工具链的复杂性封装 behind 简单的配置接口。从Makefile到CMake,从Autotools到Bazel,每个构建系统都以其独特方式处理跨架构构建的挑战。

CMake的工具链文件机制代表了现代构建系统的发展方向。通过工具链文件,开发者可以一次性定义所有交叉编译相关的设置:

# 定义目标系统
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# 指定工具链路径
set(CMAKE_C_COMPILER ${CROSS_PREFIX}gcc)
set(CMAKE_CXX_COMPILER ${CROSS_PREFIX}g++)

# 设置sysroot
set(CMAKE_SYSROOT ${SYSROOT_PATH})
set(CMAKE_FIND_ROOT_PATH ${SYSROOT_PATH})

# 调整查找策略
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

这种配置方式将平台特定的细节集中管理,使项目代码保持架构中立。当需要切换目标架构时,只需更换工具链文件,无需修改项目构建脚本。

依赖管理的架构感知是构建系统的另一个重要功能。现代构建系统能够根据目标架构自动选择适当的依赖版本和配置选项。例如,当目标架构是ARMv7时,构建系统可能会选择启用NEON优化的库版本;当目标架构是x86_64时,则可能选择支持AVX2的版本。

缓存和增量构建的优化对交叉编译尤其重要。由于交叉编译通常比本地编译更耗时,构建系统需要智能地避免重复工作。高级构建系统如Bazel使用内容寻址缓存,能够跨架构共享构建结果——只要输入文件相同,无论目标架构如何,都可以复用缓存结果。

6. 未来趋势与多架构兼容的挑战

随着计算架构的多元化发展,交叉编译正在从边缘需求变为核心能力。ARM在服务器市场的崛起、RISC-V的开放生态、以及各种领域特定架构(DSA)的出现,都使得多架构支持成为软件项目的必备特性。

通用二进制和胖二进制技术正在重新定义跨架构部署。苹果的Universal Binary和Linux的Multi-arch包允许单个文件包含多个架构的实现,在安装时自动选择适当版本。这种技术消除了交叉编译的某些复杂性,但引入了新的挑战:如何高效地构建和维护多个架构的代码。

容器化构建环境为交叉编译提供了新的解决方案。通过Docker等容器技术,开发者可以创建精确的构建环境镜像,确保构建过程的可重复性。容器还能够封装复杂的工具链配置,使交叉编译变得像本地编译一样简单:

FROM ubuntu:20.04 as builder

# 安装交叉编译工具链
RUN apt-get update && apt-get install -y \
    crossbuild-essential-arm64

# 复制源代码和构建脚本
COPY . /src
WORKDIR /src

# 执行交叉编译
RUN make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

持续集成中的多架构测试成为质量保证的关键环节。优秀的CI系统能够同时在多种架构上运行测试套件,确保代码在所有目标平台上的正确性。这种测试策略需要精心的环境管理和结果聚合,但能够极大提升软件的可靠性。

展望未来,我们可能会看到更智能的构建系统,能够自动推断最佳构建配置,甚至根据目标架构特性自动优化代码。机器学习技术的应用可能使构建系统能够从历史构建数据中学习优化策略,进一步提升跨架构构建的效率和质量。

在实际项目中实施交叉编译时,最重要的不是记住所有命令和参数,而是理解背后的设计原则。每次架构端口的尝试都是对软件抽象质量的一次测试——那些紧密耦合到特定架构的代码将难以移植,而那些良好抽象的设计则能轻松跨越架构鸿沟。这种设计理念的差异,往往决定了项目长期的可维护性和适应性。

Debian 9安装Node.js实战指南:apt/nvm/NodeSource三方案对比 Node.js 是现代 Web 应用的核心运行时,其版本兼容性与系统包管理机制深度耦合。在 Debian 这类以稳定性为优先的发行版中,Node.js 的安装并非简单执行 apt install,而是涉及版本锁定、命令别名冲突、npm 工具链缺失、全局路径权限等底层原理问题。技术价值在于平衡安全更新、生态演进与部署可复现性;典型应用场景包括老旧服务器运维、CI/CD 环境构建及多版本前端项目本地调试。本文聚焦 Debian 9(Stretch)这一已结束支持但仍在部分生产环境服役的系统,深入解析 apt 原 阅读详情

相关推荐

Grok Build:嵌入式AI代理如何重塑工作流兼容性范式

在现代软件工程中,'构建(build)'已不再是单一命令,而是横跨CI/CD、多语言生态与历史技术栈的复杂工作流语义。理解构建的本质,需从其上下文约束、工具链耦合与团队规范出发;其技术价值在于将隐性工程实践显性建模为可推理、可验证、可协同的决策链。典型应用场景包括Gradle/colcon/Android Studio等异构构建失败诊断、ComfyUI自定义节点依赖解析、以及Vue+FastAPI+PyInstaller+Ansible混合工作流统一治理。Grok Build并非CLI增强,而是以工作流为一

weixin_34122810的博客 516

超详细curl新增支持openssl(https协议)支持

curl openssl unsport protocol

litiammmm的博客 5223

Openssl及curl库交叉编译

支持LDAP:无 (--enable-ldap / --with-ldap-lib / --with-lber-lib)gcc -I -i -L -l 参数区别 / -l(静态库/动态库)_Kolde的博客-优快云博客_gcc -i。--libcurl选项:启用(-disable-libcurl-option)(同openssl)支持GSS-API: 没有 (--with-gssapi)粗略的错误:启用(--disable-verbose)。支持RTMP:不支持 (--with-librtmp)

weixin_48459290的博客 1291

curl+OpenSSL编译与使用

在网上浏览了很多资料,之前做过一次,dll没弄成,这次又弄了一遍,总结一下 我的系统与环境 win10 1607 x64的处理器与操作系统 vs2017 注意:本文章中的(?)表示作者也不确定,<…>表示使用…说明的东西替换这个<> 链接 curl官网:curl.se(可能打不开,不行就用curl的github) curl官网下载(代码压缩包):https://curl.se/download/ openSSL官网:https://www.openssl.org/ openSSL

csyh1256的博客 2478

新手避坑指南:用PIC16F15355开发板和MCC完成第一个UART通信项目

本文为新手提供了使用PIC16F15355开发板和MPLAB代码配置器(MCC)实现首个UART通信项目的完整指南。通过图形化配置系统时钟、UART参数并自动生成驱动代码,手把手教学如何避开常见陷阱,快速完成从环境搭建、代码编写到调试输出的全流程,助力开发者高效入门PIC单片机开发。

bash7scripter的博客 729

深度学习模型设计的方法和技巧

设计神经网络模型是一个迭代的过程,需要不断试验和调整各个组成部分,以达到最佳性能。同时,遵循良好的工程实践,如模块化设计、版本控制、文档记录等,也是成功的关键。

xw555666的博客 4027

使用openssl+curl让嵌入式设备实现https通讯

编译openssl库 下载openssl库,这里笔者下载的版本是openssl-1.1.1k.tar.gz。 运行tar -vxzf openssl-1.1.1k.tar.gz解压压缩包,进入openssl-1.1.1k文件夹。 运行 setarch i386 ./config no-asm shared --prefix=/home/lyy/work/openssl/arm-openssl --cross-compile-prefix=arm-linux-gnueabihf- 命令配置ope

小林同学的博客 4756

大模型事件抽取学习——论文学习笔记《LLMs Learn Task Heuristics from Demonstrations:......》

本篇博客介绍一篇发表在2024 ACL main上的文章:《LLMs Learn Task Heuristics from Demonstrations: A Heuristic-Driven Prompting Strategy for Document-Level Event Argument Extraction》 方向:大模型事件抽取 本篇博客为个人阅读论文的总结与笔记,在这里进行简单的分享 论文链接:https://arxiv.org/abs/

weixin_53751318的博客 1852

如何通过可重现构建技术实现企业级curl分发:从源码到二进制的一致性革命

在当今云原生和DevOps驱动的技术生态中,软件供应链安全已成为企业基础设施的基石。然而,传统二进制分发模式面临着一个根本性挑战:如何确保从不同环境、不同时间点构建的软件包具有完全相同的比特级一致性?curl-for-win项目通过可重现构建技术,为curl工具链提供了从源码到二进制文件的确定性转换方案,彻底解决了二进制分发的信任问题。 ## 问题驱动:二进制分发的信任鸿沟 现代软件开发流程中

gitblog_00027的博客 404

Labwindows CVI写上位机与STM32下位机通信(二)

接着上篇,这篇主要谈谈流量计数据读取。我们使用的MEMS流量计采用Modbus协议Modbus 使用RS-485 作为硬件载体。 一. Modbus协议   该协议定义了 Modbus 总线Master(主设备)与Slave(从设备)之间的通讯报文格式,对于主设备来说,Modbus 协议是联系上位机(如PC、PLC、HMI 等)的接口,而且所有的通讯都是“透明的”。控制器通信使用主-从技术,即

yang2011079080010的专栏 1万+

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 253

Python安装不是点下一步:全平台环境配置原理与排错指南

Python安装本质上是操作系统环境配置问题,涉及PATH路径管理、Shell初始化机制、多版本共存策略及IDE解释器绑定等底层原理。理解环境变量如何影响命令解析、注册表或配置文件如何决定默认解释器、虚拟环境如何隔离依赖,是解决‘pip不可用’‘模块导入失败’‘IDE标红’等高频问题的关键。本文聚焦Windows注册表与py.exe调度、macOS ARM/x86架构适配与zsh加载链、Linux发行版哲学与pyenv实践,并延伸至VS Code/PyCharm解释器识别逻辑和venv/conda/poet

bangtuo9862的博客 483

用python画带有正负值的条形图

常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析

weixin_44853840的博客 5384

Ubuntu 20.04 安装 Deno 最佳实践:安全、可复现、免依赖

Deno 是一个现代 JavaScript/TypeScript 运行时,以原生 TypeScript 支持、内置工具链和基于 URL 的依赖管理为特征,其单二进制分发模型天然适配 Ubuntu 等强调稳定性的 Linux 发行版。其核心原理在于取消 npm 和 node_modules,通过权限沙箱(--allow-read/--allow-net)实现运行时安全控制,显著提升工程可复现性与供应链安全性。技术价值体现在简化开发环境搭建、规避 apt 包管理冲突、降低 CI/CD 维护成本,并为边缘计算、系

weixin_34090562的博客 365

CAD二次开发c# .net加载cui\cuix菜单文件

public static void LoadMyCui(string cuiFile) { Document doc = Application.DocumentManager.MdiActiveDocument; object oldCmdEcho = Application.GetSystemVariable("CMDECHO"); object oldFileDia = Application.GetSys..

2128

LVGL colorwheel组件教程一(调色板)

【代码】LVGL colorwheel组件教程一(调色板)

摸鱼专家 453

curl安装

curl源码安装

wl的博客 4100

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

在window平台下,自己DIY编译OpenSSL,Libcurl ,来支持HTTPS传输协议

在window平台下,自己DIY编译OpenSSL,Libcurl ,来支持HTTPS传输协议 1 缘起   原来就了解些libcurl,一直没有机会在项目实际使用libcurl.   恰好最近一个云存储的项目,服务器使用openstack 恰好我负责现在的一个云存储SDK c++版本的开发中。 与服务器的通信都是基于HTTP/HTTPS...

weixin_30521649的博客 514

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

linux编译curl(带openssl)

linux编译curl(带openssl)

Tracytang97的博客 4891

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

curl和openssl交叉编译和curl命令使用

curl依赖openssl,所以需要先编译openssl: 编译openssl: 下载openssl:https://github.com/openssl/openssl/tree/OpenSSL_1_0_2r,下载解压。 参照:https://blog.youkuaiyun.com/ty3219/article/details/77717478 的方法一去编译,分别执行: ./Configure --pre...

yangyang031213的博客 1963

curl编译支持openssl

curl不支持openssl的静态库,所以编译openssl的时候,应该加上shared 参数,记录一下我亲手编译的参数: ./configure --prefix=/usr/local/openssl shared zlib shared 表示生成动态库 zlib 当然就是zlib了,这个库编译很容易,最好不要自行指定安装位置,因为别的软件安装的时候可能会从你指定的目录里头找不到zlib 接下来就是curl了,高版本的openssl(我用的是openssl-1.0.2e)不再导出V2版本的ssl函数,所以

qianwangwang的博客 2048

WIN11下编译CURL

总的来说,libcurl 是一个功能强大、易于使用且稳定性高的网络传输库,适用于各种类型的应用程序,从简单的命令行工具到复杂的网络服务。我们验证一下编译好的libcurl是不是支持HTTPS,可以使用编译好的libcurl生成的可执行测试程序curl.exe测试。仍然需要打开vs2017的命令行工具,因为OPENSSL编译的是64位的,所以CURL也编译64位的,还是以管理员身份启动。编译好后会在解压的CURL目录下的生成一个builds目录,编译好的libcurl库就在里面。本人下载了7.88.0版本。

oqqWang1234567的专栏 1423

交叉编译curl和openssl

交叉编译curl和openssl(rk3568)

wanchengkai的博客 1813
上一篇: 从用户体验反推技术实现:LVGL标签控件的多模态文本展示设计与交互实践
下一篇: 从零搭建LoRaWAN网关:ESP32与SX1302的硬件协同设计全解析
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值