ubuntu移植libcurl到Android平台

Libcurl编译指南——Android和Windows系统 libcurl是一个免费且易于使用的客户端URL传输库,支持DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、Telnet和TFTP。libcurl支持SSL证书,HTTP POST,HTTP PUT,FTP上传,基于HTTP表单的上传,代理,Coo... 阅读详情

简书排版
http://www.jianshu.com/p/332011ebd6e5

最近移植了很多C++平台的库,很多都是后台开发的库,因为NDK开发,以后很可能会使用,提前预研一下。
libcurl这个库很有名,用的人比较多,下载源码,直接就可以编译使用,以前在Windows平台下开发网络模块的时候,用到过这个库,很强大
最近在跟后台的人聊天过程中了解了很多C++开发的相关库,这是其中一个,Android中网络操作的库有很多种,从基本的Httpurlconnection到httpclient,volley,okhttp等等,很多选择,使用起来也非常方便,当然了,如果在jni层下使用网络库,libcurl是个很不错的选择,所以笔者决定记录一下移植的过程,之前有移植的经验,这个也比较简单。

新建脚本build_curl.sh

#!/usr/bin/env bash

# ====================================================================
# Sets the cross compile environment for Android
# Based upon OpenSSL's setenv-android.sh (by TH, JW, and SM).
#
# Crypto++ Library is copyrighted as a compilation and (as of version 5.6.2)
# licensed under the Boost Software License 1.0, while the individual files
# in the compilation are all public domain.
#
# See http://www.cryptopp.com/wiki/Android_(Command_Line) for more details
# ====================================================================

unset IS_CROSS_COMPILE

unset IS_IOS
unset IS_ANDROID
unset IS_ARM_EMBEDDED

unset AOSP_FLAGS
unset AOSP_SYSROOT
unset AOSP_STL_INC
unset AOSP_STL_LIB
unset AOSP_BITS_INC

# Set AOSP_TOOLCHAIN_SUFFIX to your preference of tools and STL library.
#   Note: 4.9 is required for the latest architectures, like ARM64/AARCH64.
# AOSP_TOOLCHAIN_SUFFIX=4.8
# AOSP_TOOLCHAIN_SUFFIX=4.9
if [ -z "$AOSP_TOOLCHAIN_SUFFIX" ]; then
	AOSP_TOOLCHAIN_SUFFIX=4.9
fi

# Set AOSP_API to the API you want to use. 'armeabi' and 'armeabi-v7a' need
#   API 3 (or above), 'mips' and 'x86' need API 9 (or above), etc.
# AOSP_API="android-3"     # Android 1.5 and above
# AOSP_API="android-4"     # Android 1.6 and above
# AOSP_API="android-5"     # Android 2.0 and above
# AOSP_API="android-8"     # Android 2.2 and above
# AOSP_API="android-9"     # Android 2.3 and above
# AOSP_API="android-14"    # Android 4.0 and above
# AOSP_API="android-18"    # Android 4.3 and above
# AOSP_API="android-19"    # Android 4.4 and above
# AOSP_API="android-21"    # Android 5.0 and above
# AOSP_API="android-23"    # Android 6.0 and above
if [ -z "$AOSP_API" ]; then
	AOSP_API="android-21"
fi

#####################################################################

# ANDROID_NDK_ROOT should always be set by the user (even when not running this script)
#   http://groups.google.com/group/android-ndk/browse_thread/thread/a998e139aca71d77.
# If the user did not specify the NDK location, try and pick it up. We expect something
#   like ANDROID_NDK_ROOT=/opt/android-ndk-r10e or ANDROID_NDK_ROOT=/usr/local/android-ndk-r10e.

export ANDROID_NDK_ROOT=/workspace/android-ndk-r10e

if [ -z "$ANDROID_NDK_ROOT" ]; then
	ANDROID_NDK_ROOT=$(find /opt -maxdepth 1 -type d -name android-ndk-r10* 2>/dev/null | tail -1)

	if [ -z "$ANDROID_NDK_ROOT" ]; then
		ANDROID_NDK_ROOT=$(find /usr/local -maxdepth 1 -type d -name android-ndk-r10* 2>/dev/null | tail -1)
	fi
	if [ -z "$ANDROID_NDK_ROOT" ]; then
		ANDROID_NDK_ROOT=$(find $HOME -maxdepth 1 -type d -name android-ndk-r10* 2>/dev/null | tail -1)
	fi
fi

# Error checking
if [ ! -d "$ANDROID_NDK_ROOT/toolchains" ]; then
	echo "ERROR: ANDROID_NDK_ROOT is not a valid path. Please set it."
	[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
fi

#####################################################################

if [ "$#" -lt 1 ]; then
	THE_ARCH=armv7
else
	THE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
fi

# https://developer.android.com/ndk/guides/abis.html
case "$THE_ARCH" in
  arm|armv5|armv6|armv7|armeabi)
	TOOLCHAIN_BASE="arm-linux-androideabi"
	TOOLNAME_BASE="arm-linux-androideabi"
	AOSP_ABI="armeabi"
	AOSP_ARCH="arch-arm"
	AOSP_FLAGS="-march=armv5te -mtune=xscale -mthumb -msoft-float -funwind-tables -fexceptions -frtti"
	;;
  armv7a|armeabi-v7a)
	TOOLCHAIN_BASE="arm-linux-androideabi"
	TOOLNAME_BASE="arm-linux-androideabi"
	AOSP_ABI="armeabi-v7a"
	AOSP_ARCH="arch-arm"
	AOSP_FLAGS="-march=armv7-a -mthumb -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti"
	;;
  hard|armv7a-hard|armeabi-v7a-hard)
	TOOLCHAIN_BASE="arm-linux-androideabi"
	TOOLNAME_BASE="arm-linux-androideabi"
	AOSP_ABI="armeabi-v7a"
	AOSP_ARCH="arch-arm"
	AOSP_FLAGS="-mhard-float -D_NDK_MATH_NO_SOFTFP=1 -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti -Wl,--no-warn-mismatch -Wl,-lm_hard"
	;;
  neon|armv7a-neon)
	TOOLCHAIN_BASE="arm-linux-androideabi"
	TOOLNAME_BASE="arm-linux-androideabi"
	AOSP_ABI="armeabi-v7a"
	AOSP_ARCH="arch-arm"
	AOSP_FLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -Wl,--fix-cortex-a8 -funwind-tables -fexceptions -frtti"
	;;
  armv8|armv8a|aarch64|arm64|arm64-v8a)
	TOOLCHAIN_BASE="aarch64-linux-android"
	TOOLNAME_BASE="aarch64-linux-android"
	AOSP_ABI="arm64-v8a"
	AOSP_ARCH="arch-arm64"
	AOSP_FLAGS="-funwind-tables -fexceptions -frtti"
	;;
  mips|mipsel)
	TOOLCHAIN_BASE="mipsel-linux-android"
	TOOLNAME_BASE="mipsel-linux-android"
	AOSP_ABI="mips"
	AOSP_ARCH="arch-mips"
	AOSP_FLAGS="-funwind-tables -fexceptions -frtti"
	;;
  mips64|mipsel64|mips64el)
	TOOLCHAIN_BASE="mips64el-linux-android"
	TOOLNAME_BASE="mips64el-linux-android"
	AOSP_ABI="mips64"
	AOSP_ARCH="arch-mips64"
	AOSP_FLAGS="-funwind-tables -fexceptions -frtti"
	;;
  x86)
	TOOLCHAIN_BASE="x86"
	TOOLNAME_BASE="i686-linux-android"
	AOSP_ABI="x86"
	AOSP_ARCH="arch-x86"
	AOSP_FLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -funwind-tables -fexceptions -frtti"
	;;
  x86_64|x64)
	TOOLCHAIN_BASE="x86_64"
	TOOLNAME_BASE="x86_64-linux-android"
	AOSP_ABI="x86_64"
	AOSP_ARCH="arch-x86_64"
	AOSP_FLAGS="-march=x86-64 -msse4.2 -mpopcnt -mtune=intel -funwind-tables -fexceptions -frtti"
	;;
  *)
	echo "ERROR: Unknown architecture $1"
	[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
	;;
esac


# Based on ANDROID_NDK_ROOT, try and pick up the path for the tools. We expect something
# like /opt/android-ndk-r10e/toolchains/arm-linux-androideabi-4.7/prebuilt/linux-x86_64/bin
# Once we locate the tools, we add it to the PATH.
AOSP_TOOLCHAIN_PATH=""
for host in "linux-x86_64" "darwin-x86_64" "linux-x86" "darwin-x86"
do
	if [ -d "$ANDROID_NDK_ROOT/toolchains/$TOOLCHAIN_BASE-$AOSP_TOOLCHAIN_SUFFIX/prebuilt/$host/bin" ]; then
		AOSP_TOOLCHAIN_PATH="$ANDROID_NDK_ROOT/toolchains/$TOOLCHAIN_BASE-$AOSP_TOOLCHAIN_SUFFIX/prebuilt/$host/bin"
		break
	fi
done


#####################################################################

# Error checking
if [ ! -d "$ANDROID_NDK_ROOT/platforms/$AOSP_API" ]; then
	echo "ERROR: AOSP_API is not valid. Does the NDK support the API? Please edit this script."
	[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
elif [ ! -d "$ANDROID_NDK_ROOT/platforms/$AOSP_API/$AOSP_ARCH" ]; then
	echo "ERROR: AOSP_ARCH is not valid. Does the NDK support the architecture? Please edit this script."
	[ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
fi

# Android SYSROOT. It will be used on the command line with --sysroot
#   http://android.googlesource.com/platform/ndk/+/ics-mr0/docs/STANDALONE-TOOLCHAIN.html
export AOSP_SYSROOT="$ANDROID_NDK_ROOT/platforms/$AOSP_API/$AOSP_ARCH"

# TODO: export for the previous GNUmakefile-cross. These can go away eventually.
export ANDROID_SYSROOT=$AOSP_SYSROOT


#####################################################################


export CPP="$AOSP_TOOLCHAIN_PATH/$TOOLNAME_BASE-cpp --sysroot=$AOSP_SYSROOT"
export CC="$AOSP_TOOLCHAIN_PATH/$TOOLNAME_BASE-gcc --sysroot=$AOSP_SYSROOT"
export CXX="$AOSP_TOOLCHAIN_PATH/$TOOLNAME_BASE-g++ --sysroot=$AOSP_SYSROOT"
export CFLAGS="-pie -fPIE"
export LDFLAGS="-pie -fPIE"
#####################################################################

export PREFIX=/usr/local/curl/$AOSP_ABI
export CC="$AOSP_TOOLCHAIN_PATH/$TOOLNAME_BASE-gcc --sysroot=$AOSP_SYSROOT"


VERBOSE=1
if [ ! -z "$VERBOSE" ] && [ "$VERBOSE" != "0" ]; then
  echo "ANDROID_NDK_ROOT: $ANDROID_NDK_ROOT"
  echo "AOSP_TOOLCHAIN_PATH: $AOSP_TOOLCHAIN_PATH"
  echo "AOSP_ABI: $AOSP_ABI"  
  echo "AOSP_API: $AOSP_API"
  echo "CC: $CC"
  echo "AOSP_SYSROOT: $AOSP_SYSROOT"
fi


./configure \
    --prefix=$PREFIX \
    --enable-static \
    --enable-shared \
    --host=$TOOLNAME_BASE

[ "$0" = "$BASH_SOURCE" ] && exit 0 || return 0

build_all.sh

#!/bin/bash

for arch in armeabi armeabi-v7a armeabi-v7a-hard arm64-v8a mips mips64 x86 x86_64
do
    bash build_curl.sh $arch
    make
    sudo make install
done

目录结构

|—curl源码目录
  |—build_curl.sh
  |—build_all.sh
  |—...

执行脚本

sh build_all.sh

编译成功之后
在/usr/local/curl目录里

###测试一下
新建JNI目录,将刚才生成的armeabi目录里的include文件夹和lib文件夹复制进去
新建Android.mk文件

LOCAL_PATH := $(call my-dir)

#libcurl库
include $(CLEAR_VARS)
LOCAL_MODULE := libcurl
LOCAL_SRC_FILES := lib/libcurl.a 
include $(PREBUILT_STATIC_LIBRARY) 


#测试程序
include $(CLEAR_VARS)
LOCAL_MODULE := main
LOCAL_SRC_FILES := main.cpp
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
LOCAL_LDLIBS := -llog -lz
LOCAL_STATIC_LIBRARIES := libcurl

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE

include $(BUILD_EXECUTABLE)

新建Application.mk添加对C++的支持

APP_ABI := armeabi
APP_PLATFORM := 12
APP_CPPFLAGS += -fexceptions -frtti
APP_STL := stlport_static

新建源文件

#include <curl/curl.h>
#include <iostream>

using namespace std;

int main(int argc,char * argv[])
{
    //定义CURL类型的指针
    CURL * curl;
    //定义CURLcode类型的变量,保存返回状态码
    CURLcode res;

    //初始化一个CURL类型的指针
    curl = curl_easy_init();
    if(curl!=NULL)
    {

        curl_easy_setopt(curl, CURLOPT_URL, argv[1]);        
        //curl_easy_setopt(curl, CURLOPT_WRITEDATA, recv);

        res = curl_easy_perform(curl);
        if(res != CURLE_OK){
             cout << curl_easy_strerror(res) << endl;
    }

        //清除curl操作.
        curl_easy_cleanup(curl);
    }

    return 0;
}

目录结构

编译生成

ndk-build

最后push到手机上执行

项目地址
https://github.com/byhook/libcurl-android

Libcurl库移植指南(上)--OpenSSL库移植 一、环境配置 系统版本:ubuntu16.04 32位 NDK版本:Android-ndk-r10b 源码版本:openssl-1.1.0f 环境变量:/etc/profile export NDK_HOME=/opt/android/ndk/android-ndk-r10b export PATH=/opt/android/ndk/android-ndk-r10b export... 阅读详情

相关推荐

安卓Termux安装Metasploit与永恒之蓝漏洞复现实战

渗透测试是网络安全领域的核心实践,旨在通过模拟攻击来评估系统防御能力。其原理在于主动发现并利用系统、应用或网络中的安全弱点,验证漏洞的可利用性及潜在危害。这项技术的核心价值在于将攻击者视角引入防御体系,实现“以攻促防”,是构建主动安全能力的关键。在移动办公和应急响应等场景下,传统依赖于笨重PC的渗透测试环境往往不够灵活。本文聚焦于如何在安卓手机的Termux环境中,部署功能完整的Metasploit渗透测试框架,并完成经典的永恒之蓝漏洞复现。通过优化Termux配置、解决ARM架构下的依赖编译问题,以及详解

weixin_34245082的博客 419

ubuntu下Android平台的libcurl的编译测试

http://blog.youkuaiyun.com/cnhua57inyu/article/details/41693661前面的讲解已经很详细,完全可以在linux下成功编译出curl的静态库供Android JNI调用,但本着详细的原则也为了以后再次用到时方便查阅,对此做个总结。

u013100408的专栏 2180

构建专属Godot CI镜像:容器化游戏开发自动化实战指南

容器化技术通过Docker等工具,为软件开发提供了隔离、一致且可版本化的运行环境,其核心原理在于利用操作系统级虚拟化实现资源隔离与依赖封装。这一技术显著提升了开发与部署流程的可靠性和可重复性,尤其在需要多平台构建的复杂场景中价值凸显。在游戏开发领域,Godot引擎项目常涉及Windows、Linux、Web乃至Android等多平台导出,环境配置复杂且易出错。通过构建专属的Godot CI镜像,可以将Godot引擎版本、.NET SDK、平台特定工具链(如Emscripten、Android SDK)等依赖

迷彩风情 389

curl android 编译,libcurl的android移植

对于libcurl大家在熟悉不过了,不做过多的介绍,这是libcurl的官网最近要在android工程中实现http等协议的下载,于是自然想到了libcurl,但是移植它到android还是走了一些弯路。有很多网友尝试用NDK来编译libcurl,参考了很多资料,并且libcurl自身也有了Android.mk,但是我始终没有编译成功,无奈之下想到了传统的交叉编译,结合先前从ndk中制作的独立的交...

weixin_30135925的博客 459

llama.cpp核心原理:C/C++ CPU推理与GGUF模型格式深度解析

大语言模型(LLM)本地化部署的核心挑战在于运行时确定性、内存可控性与跨平台兼容性。传统Python框架受限于解释器开销、GC不确定性及CUDA绑定,难以满足边缘设备、嵌入式系统和工业实时场景的严苛要求。llama.cpp以纯C/C++实现,通过零依赖构建、显式内存管理与硬件亲和设计,重构了CPU推理的技术范式;其配套的GGUF模型格式本质是内存映射协议,支持mmap零拷贝加载、量化内核直通与多后端统一抽象。结合CMake驱动的硬件能力探测与条件编译,该技术栈已成为轻量级、可审计、可嵌入的大模型落地事实标准

weixin_33676492的博客 432

Ubuntu零基础入门到精通【1.2讲】:Ubuntu 与 Linux 的关系 —— 你用的到底是什么?

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 3347

【国密】Libcurl的Android库编译流程及使用详解

若还有问题随时评论联系我~

Innocence_0的博客 1320

libcurl在android下的移植、编译与测试源码

libcurl在android下的移植、编译与测试源码,libcurl在android下的移植、编译与测试源码

Android上的libcurl

curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持的协议有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。

katerdaisy的博客 2142

CRISPR筛选全流程指南:从文库构建到数据分析实战

功能基因组学研究需要高效解析基因型与表型的关联,高通量筛选技术是其中的关键工具。基于CRISPR系统的筛选方法通过大规模sgRNA文库扰动基因功能,结合慢病毒递送和测序分析,能够系统鉴定影响细胞增殖、耐药、病毒感染的候选基因。与RNAi或化学小分子筛选相比,CRISPR筛选具有覆盖全基因组、脱靶率低、信号清晰等优势,已广泛应用于药物靶点发现、合成致死和免疫治疗机制研究。本文围绕实验设计与操作中的核心要点展开,涵盖文库扩增、病毒滴度控制、MOI把握、筛选模式选择以及基于MAGeCK的sgRNA丰度分析,并针对

weixin_31188927的博客 284

保姆级教程:用掘金量化API手把手复现一个年化17%的网格交易策略(附完整Python代码)

本文提供了一份详细的掘金量化API教程,手把手教你构建一个年化17%的网格交易策略。通过完整的Python代码实现,深入解析网格交易的核心逻辑、参数配置和动态调仓机制,帮助量化新手快速掌握策略开发全流程。教程包含环境配置、代码实现、回测分析和常见问题解答,是学习量化投资的实用指南。

weixin_33709364的博客 300

移植gba到Android平台,ubuntu移植libcurl到Android平台

最近移植了很多C++平台的库,很多都是后台开发的库,因为NDK开发,以后很可能会使用,提前预研一下。libcurl这个库很有名,用的人比较多,下载源码,直接就可以编译使用,以前在Windows平台下开发网络模块的时候,用到过这个库,很强大最近在跟后台的人聊天过程中了解了很多C++开发的相关库,这是其中一个,Android中网络操作的库有很多种,从基本的Httpurlconnection到httpc...

weixin_32620265的博客 268

灵魂三问:因果推断

什么是因果推断?为什么研究因果推断?怎么进行因果推断研究?

ML OR 智能决策的博客 2902

如何使用android独立工具链快速移植开源项目

我们大家都知道android的ndk开发可以编译c,c++代码,不过需要自己写Android.mk文件。但是对于大多数开源项目来说,代码量很大,而且在编译前需要通过configure来配置编译选项,这种情况下,自己写Android.mk文件是很不现实的。 不过Google给我们提供了一种按照标准linux系统编译项目的方式来移植开源代码的工具。就是standalone toolchain。 如

sevenshal的专栏 1227

FileZilla Server 1.2.0 TLS证书过期问题

FileZilla Server TLS证书过期后重新生成

Wigle的备忘录 7528

从零到一:基于STM32F103C8T6与HAL库的磁悬浮电赛装置实战解析

本文详细解析了基于STM32F103C8T6微控制器与HAL库,从零构建磁悬浮装置的完整实战方案。文章深入剖析了硬件设计中的线圈布局与“反向串联”巧思,以节省PWM资源;并阐述了采用三闭环PID控制算法的软件实现,结合Keil开发环境与HAL库进行工程搭建与调试。该方案为电子设计竞赛(电赛)提供了高可行性的参考,是嵌入式软硬件综合实践的优秀范例。

weixin_29169505的博客 274

libcurl 移植 支持https,openssl NDK (二)

一 、编译环境介绍:(有一部分原因是环境造成编译失败) 系统版本:ubuntu-16.04.3-desktop-amd64 64位(可以使用虚拟机) NDK版本:Android-ndk-r10b (已经测试,使用 Android-ndk-r17b无法通过) 源码版本: curl-7.61.0 https://curl.haxx.se...

q610098308的专栏 721

Spring AI从入门到精通:构建智能Spring应用的全面指南

随着人工智能技术的快速发展,将大语言模型(LLM)与企业应用集成已成为趋势。Spring AI作为Spring官方推出的AI集成框架,为开发者提供了便捷、标准化的方式来构建智能应用。本文将从基础概念到高级应用,全面介绍Spring AI的核心功能与实践技巧。Spring AI 是 VMware 于 2023 年推出的开源框架,旨在简化大语言模型(LLM)与 Spring 应用的集成。它提供了统一的 API 抽象,支持多种 LLM 供应商,包括 OpenAI、Azure OpenAI、Hugging Face

qq_36929638的博客 1069

libcurl 移植 支持https,openssl NDK (一)

一 、编译环境介绍:(有一部分原因是环境造成编译失败) 系统版本:ubuntu-16.04.3-desktop-amd64 64位(可以使用虚拟机) NDK版本:Android-ndk-r10b (已经测试,使用 Android-ndk-r17b无法通过) 源码版本:openssl-1.1.0f https://www....

q610098308的专栏 1018

【批处理脚本】-0.1-如何运行批处理bat文件

如何运行批处理bat文件

「汽车电子助手」的博客 1586

把外部系统接到 SAP Build Process Automation 的两条路:前台直连与后台编排的完整范式

想把外部系统接入到你的【销售订单管理】审批流程,最稳妥的路径是:在流程里开一个,在 BTP 配好以为核心的 Destination,让前端经由approuter代理、后台通过 Cloud SDK 直连,任务处理用My Inbox或Task APIs,异步对接用。这套组合拳,既满足安全边界与运维规范,又能让前台与后台两个世界各取所需、自然衔接。SAP。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1661

Jazz² Resurrection:如何在现代设备上重温这款经典2D平台游戏?

你是否还记得1998年那款充满活力的《Jazz Jackrabbit 2》?这款经典的2D平台游戏曾经风靡一时,但随着操作系统和硬件不断更新,原版游戏在现代设备上运行变得越来越困难。今天,我要介绍一个开源项目——Jazz² Resurrection,它完美解决了这个痛点,让这款经典游戏在Windows、Linux、macOS、Android甚至Nintendo Switch和Web平台都能流畅运行

gitblog_00023的博客 514

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Qt遗产项目环境重置:从环境清理到构建配置的完整实践指南

在软件工程实践中,依赖管理和环境隔离是保障项目可移植性与可维护性的核心概念。其原理在于通过固化特定版本的库与工具链,避免因系统环境差异导致的兼容性问题,从而确保构建过程的一致性与可重复性。这一技术价值在维护历史遗留项目时尤为凸显,特别是面对那些依赖老旧框架版本、第三方库已停止维护的代码库。应用场景广泛涵盖项目交接、环境复现、构建系统迁移以及为老旧代码搭建CI/CD流水线等。本文聚焦于Qt框架下的遗产项目,针对Qt 5.12等版本,详细拆解如何从零开始重建一个干净、可编译的开发环境,系统性地解决环境清理、源码

weixin_33889665的博客 315

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

银河麒麟ARM64上源码编译ONNX Runtime实战指南

ONNX Runtime作为跨平台推理引擎,其核心价值在于统一模型部署接口、提升AI应用在异构硬件上的可移植性与执行效率。在国产信创环境中,ARM64架构与定制化Linux发行版(如银河麒麟V10 SP1)构成典型部署场景,但官方预编译包常因glibc版本不兼容、Python ABI错配、依赖库缺失等问题失效。此时,源码编译成为唯一可靠路径——它要求精准匹配GCC 9.3+、禁用OpenMP、强制C++11 ABI关闭,并绑定系统级protobuf与SSL库。该方案广泛应用于政务云AI中台、工业质检终端及边

weixin_29230773的博客 120

Lightpanda 无头浏览器快速上手:三步跑起来,内存只有 Chrome 的 1/16

抓 100 个页面,Headless Chrome 峰值内存 2GB,Lightpanda 无头浏览器只要 123MB,耗时 5 秒对 46 秒。它不是 Chromium 的分支,也不是 WebKit 的补丁,而是用 Zig 语言从零写的一个新浏览器。它只保留自动化需要的三样东西:网络请求、DOM、JavaScript 执行,其余一律不装。 ## 三步跑起来 预编译二进制覆盖 Linux 和

gitblog_00852的博客 390
上一篇: ubuntu移植crypto++到Android平台
下一篇: Linux下的GIF录制
handy周
handy周 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄14年 507粉丝 240原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值