尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
GMP静态库编译与中文文档整理实战指南
简介这是一份面向C/C开发者的GMP大数运算库配套学习与集成资源尤其适合密码学、数学软件与金融计算等需要任意精度整数、有理数或浮点运算的场景。对于不习惯英文文档、或希望跳过编译配置直接使用的开发者这套材料正好补上这些门槛。压缩包共4个文件包括一份中文PDF文档、一个头文件以及Release与Debug两个版本的静态链接库整体大小仅1.01MB。头文件提供接口声明静态库可直接链接PDF文档则对照库函数与数据结构作了中文说明方便查阅。文档围绕mpz_t、mpq_t、mpf_t等核心类型以及初始化、赋值、算术运算、取模、位操作等常用API给出示例可以帮助读者理解RSA、DSA、ECC等算法中的大数模幂与因数分解实现。静态链接库让项目在目标机器上无需额外安装GMP环境简化部署和分发。目前已有354人学习下载对于希望快速上手GMP或替换官方英文手册的中文开发者来说是一份体量小巧、即拿即用的实用资源。1. 为什么大数计算要碰 GMP先搞清楚它在解决什么问题我最早被 GMP 逼到墙角是在一个 RSA 密钥生成的小工具里RSA 模数是 1024 位C 语言自带的unsigned long long连它的零头都装不下。当时自己的第一反应是“用数组拆着算”但拆到乘法进位就开始怀疑人生。GMPGNU Multiple Precision Arithmetic Library就是专门干这个的它是大数计算领域的基准实现很多密码学、数论、科学计算项目都拿它当底层大数引擎。正因为官方文档是英文的黑匣子中文资料又零散所以“中文文档 静态链接库”这组关键词才值得单独写一篇。这里不聊算法内幕只解决两件事怎么整理出一份能用的中文速查文档怎么把 GMP 编译成一个不依赖环境的静态链接库老老实实跑起来。2. 从源码到静态库自编译 GMP 的完整命令链2.1 为什么要自编译而不用系统包很多 Linux 发行版都有现成的 libgmp-dev 包一条命令能装上但装完发现主要拿到的是动态库/usr/lib/x86_64-linux-gnu/libgmp.so静态库libgmp.a要么没有要么版本旧。GMP 这个库很特殊它在 configure 阶段会检测当前 CPU 的指令集比如 SSE2、AVX2然后选择不同的汇编优化路径。系统包一般编译成最小兼容模式跑起来虽然不出错但大数乘法性能可能差一截。你要是准备把 GMP 静态打进一个不允许安装依赖的自研工具里就更有理由自己编一份。静态链接库在这里的价值是可执行文件自带 GMP 的全部实现换一台没有开发包的机器也能跑不用去设置LD_LIBRARY_PATH也不会出现“我这台机器明明有 GMP 但程序说找不到”这类玄学问题。代价是库体积增大不少但现代磁盘和静态链接的收益相比通常值得。2.2 最小编译步骤与关键配置项GMP 源码编译没有用 CMake依然是传统的 autotools 流程。我一般在干净容器里做避免环境里的旧版本干扰。以下命令针对 GMP 6.2.1这也是目前最常见的生产版本# 准备工具链Ubuntu/Debian 上需要 m4、gcc、make sudo apt-get install m4 build-essential # 解压源码包 tar -xJf gmp-6.2.1.tar.xz cd gmp-6.2.1 # 只生成静态库并生成 PIC位置无关代码 ./configure CFLAGS-O2 -fPIC --enable-static --disable-shared --with-pic # 并行编译-j 后填你的 CPU 核数 make -j4 # 跑自带测试集这一步建议不要跳 make check # 安装到独立前缀方便引用和卸载 sudo make install prefix/usr/local/gmp_static逻辑说明--enable-static指示生成libgmp.a--disable-shared关闭动态库这两项配合就是标题里“静态链接库”的最直接来源。--with-pic让静态库里的.o文件带位置无关码如果你只是写普通可执行文件它对结果影响不大但如果你打算再把 GMP 编进另一个共享库或者要做静态库合并少了它就会出现relocation R_X86_64_32 against .text之类的重定位错误。CFLAGS-O2 -fPIC里的-O2是 GMP 官方测试最充分的优化级别没必要手痒上-O3-fPIC和--with-pic作用类似双保险。参数说明如果只想保留静态库当前的配置是够的。如果你希望 GMP 也能提供动态库把--disable-shared改成--enable-shared但要注意之后安装时是同时生成.so和.a链接时默认优先选.so这时要想强制静态链接就得靠-static或直接指定.a路径。prefix一定要写清楚它决定make install把头文件放哪后面找gmp.h和libgmp.a都靠它。编译完成后在安装目录里能看到的文件大致有文件作用include/gmp.h主头文件包含所有函数原型和版本宏lib/libgmp.a大数核心静态库C 接口lib/libgmpxx.aC 封装接口的静态库如果编译时启用了 C 接口lib/libgmp.lalibtool 元数据不用直接链接它这里有一个常见误读libgmpxx.a是 C 接口库依赖libgmp.a用 C 写代码时两个都要链。如果你只需要 C 接口只链libgmp.a就行。2.3 验证静态库是否可用编译完了不验证等于白编。我用一个最小的 C 程序验证顺便确认头文件和库版本能对上cat test_gmp.c EOF #include stdio.h #include gmp.h int main(void) { mpz_t a, b, c; mpz_inits(a, b, c, NULL); mpz_set_str(a, 123456789012345678901234567890, 10); mpz_set_str(b, 987654321098765432109876543210, 10); mpz_add(c, a, b); gmp_printf(a b %Zd\n, c); mpz_clears(a, b, c, NULL); return 0; } EOF gcc test_gmp.c \ -I/usr/local/gmp_static/include \ /usr/local/gmp_static/lib/libgmp.a \ -o test_gmp ./test_gmp代码逻辑mpz_inits是 GMP 6.x 提供的可变参数初始化函数可以一次初始化多个mpz_t结束时必须传NULL表示终止早期的代码习惯是逐个mpz_init也可以但这套新接口更容易漏。mpz_set_str第二个参数是十进制字符串第三个参数是进制传 10 就是十进制。mpz_add把a和b相加写入c。gmp_printf是 GMP 自己实现的格式化输出%Zd专门用于mpz_t如果你用普通printf(%d)去打印数据会被解释成地址或截断这是新手最容易翻车的地方。链接命令里我没有用-L和-l而是把/usr/local/gmp_static/lib/libgmp.a完整路径写出来。这样做的最大好处是链接器不会去搜动态库你明确知道链的是哪份静态库。如果用的是-lgmp它会优先找libgmp.so除非前一个目录下只有.a。如果看到undefined reference to __gmpz_add多半是编译时用的头文件版本和链接的静态库版本不一致回看prefix就知道问题在哪。提示验证时最好在安装目录和源码目录各跑一遍源码目录里会有一份编译中间产物手动用它们链接也能过但那不代表安装成功。3. 中文文档怎么找、怎么整理手头能用的几份资料与索引方法3.1 官方手册与中文翻译现状GMP 的文档质量很高但官方是英文的。GMP 手册的结构是先讲 GMP 基础、变量约定然后按mpz、mpq、mpf、mpn等类型分章最后有汇编编程、平台说明。很多人在网上搜“GMP 中文文档”找到的要么是某个博客翻译了开头的几章要么是打印版的旧 PDF函数列表不全不能当作可靠索引。实际项目里我一般把官方手册当“唯一真源”中文材料只用来理解背景不直接抄写函数签名。为什么中文文档这么缺GMP 的维护者几乎没有为某个翻译版本背书官方手册每版都在变比如 6.0 之前用的是mpz_random6.0 之后被gmp_randstate_t体系取代网上很多中文教程还停留在老接口照抄就会出现编译错误。所以“整理一份属于自己项目的中文文档”比“找一份完美翻译”更现实。3.2 用 pdf 转 markdown 自制检索版具体做法是我自己常用的把官方 PDF 或 HTML 手册转成纯文本和 Markdown然后按函数名建立索引。这样以后查多精度阈值、反正切、模幂等函数几十秒就能定位。# 方式一PDF 转文本保留版面布局 pdftotext -layout gmp-man-6.2.1.pdf gmp-man.txt # 方式二抓官方 HTML 手册再转 Markdown # 官方发布 html 压缩包时解压后用 pandoc 批量转换 pandoc gmp-man-6.2.1.html -o gmp-man.md --wrapnone逻辑说明pdftotext -layout对公式复杂的小部分还原度不高组合数字可能被拆出空格但胜在简单。pandoc把 HTML 转成 Markdown 后表格会保留得更好。GMP 手册的 HTML 版本来就有锚点转成 Markdown 后同一个函数名会在多个章节重复出现所以我不会直接通读而是用grep抽# 比如找所有 mpz 开头的函数 grep -n mpz_ gmp-man.md | head -50 # 把函数原型的行抽出来形成自己的速查索引 grep -nE ^(void|int|unsigned|char|mpz_t|mpq_t|mpf_t).*mpz_[a-z_]\( gmp-man.md my_gmp_index.txt这段的核心是官方手册是权威自己的索引是工作台。两种方式可以搭配。如果你已经在项目里用 Doxygen 或 IDE也可以让 IDE 索引 GMP 头文件然后在打印输出里加中文注释。自制速查表时我会从gmp-man.md中把函数原型先抽出来然后按项目需要分段复制进 Excel 或 Markdown 表再在第三列写中文说明。写说明时只写“做什么、参数陷阱、返回要注意什么”不抄英文原文。因为 GMP 的函数命名很直白比如mpz_add、mpz_sub英文说明本身不影响使用真正的中文价值在于标注 old/new 接口差异和内存管理责任。3.3 常用函数速查表英文原版中文注释这一节给一个最精简的速查表覆盖 C 接口里最高频的部分。不要把它当成全部文档它只是你入门的导航。类别函数原型节选中文说明备注初始化void mpz_init(mpz_t x) / void mpz_inits(mpz_t x, ...)初始化一个或多个大整数mpz_inits需以NULL结尾释放void mpz_clear(mpz_t x) / void mpz_clears(mpz_t x, ...)释放内部动态内存必须和初始化成对赋值void mpz_set_str(mpz_t rop, const char *str, int base)把字符串按指定进制转为大整数base 传 10 最常用输出void gmp_printf(const char *fmt, ...)支持%Zd打印大整数不要用普通 printf模幂void mpz_powm(mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod)RSA 核心base^exp mod mod性能极高已知整除除法void mpz_divexact(mpz_t q, const mpz_t n, const mpz_t d)已知 n 能被 d 整除时的快速除法比普通除法快很多素数int mpz_probab_prime_p(const mpz_t n, int reps)概率素数测试reps 越大越严字节互转void mpz_import(mpz_t rop, size_t count, int order, size_t size, int endian, size_t nails, const void *op)把字节数组转成大整数密码学里用来解大端字节串随机数void mpz_urandomb(mpz_t rop, gmp_randstate_t state, mp_bitcnt_t n)生成 0 到 2^n-1 的均匀随机数需先初始化 gmp_randstate_t下面解释两个容易误用的点。第一个是mpz_import参数很多但最常见的用法是从 32 字节的 RSA 签名里恢复整数mpz_import(x, 32, 1, 1, 1, 0, buf)含义是 32 个一字节元素、顺序为大端、正常字节序、没有 nails。第二个是随机数接口GMP 6.x 推荐用gmp_randinit_default生成状态再用mpz_urandomb取随机数老教程里的mpz_random在新版里基本被废弃你如果照着旧中文文档写链接器会提醒你符号不存在或者行为不符合预期。注意3.3 这份速查表是给 C 接口用的。如果你用 CGMP 还提供了gmpxx.h封装成mpz_class内部还是同一个库静态链接方式不变。通过自己的整理你会得到两个成果一个是gmp-man.md全文检索文件一个是这份速查表。以后团队里新成员上手直接把这两份交给他比丢 PDF 文件有用得多。4. 链接静态库的三种方式编译期、链接期与运行时4.1 直接 gcc 链接 libgmp.a编译期需要头文件链接期需要库文件运行时则因为静态库已经打进可执行文件不需要再找 GMP 的动态库。最简单的方式就是直接把libgmp.a当作一个普通目标文件给 gccgcc -o demo demo.c -I/usr/local/gmp_static/include \ /usr/local/gmp_static/lib/libgmp.aGMP 静态库本身是多个.o打包的链接器只会提取它需要的目标文件所以最终可执行文件包含的只是 GMP 中被引用的部分不是全部库。如果你希望整个 GMP 全部打进来可以用-Wl,--whole-archivegcc -o demo demo.c -I/usr/local/gmp_static/include \ -Wl,--whole-archive /usr/local/gmp_static/lib/libgmp.a -Wl,--no-whole-archive--whole-archive会把归档里的所有目标文件都拉进来一般用不上但如果 GMP 发生了内部符号引用问题可以用这个方式排查。如果要完全静态链接包括 libc则使用-staticgcc -o demo demo.c -I/usr/local/gmp_static/include \ /usr/local/gmp_static/lib/libgmp.a -static注意-static会把 libc 也静态链入生成的可执行文件体积明显变大但在完全没有基础运行时的 Docker 镜像或嵌入式环境里很有用。GMP 的libgmp.a只依赖 libc 和 libgcc 的若干函数所以这种操作是可行的。4.2 CMake 里怎么 find 与 target_link_libraries大型项目用 CMake静态库的链接要处理得更稳。常见的做法是用find_library和find_path先找到自编译的库和头文件再给目标添加链接find_library(GMP_LIBRARY NAMES gmp libgmp PATHS /usr/local/gmp_static/lib NO_DEFAULT_PATH ) find_path(GMP_INCLUDE_DIR NAMES gmp.h PATHS /usr/local/gmp_static/include NO_DEFAULT_PATH ) if(NOT GMP_LIBRARY OR NOT GMP_INCLUDE_DIR) message(FATAL_ERROR 没有找到 GMP 静态库请先编译安装到 /usr/local/gmp_static) endif() add_executable(my_demo main.c) target_include_directories(my_demo PRIVATE ${GMP_INCLUDE_DIR}) target_link_libraries(my_demo PRIVATE ${GMP_LIBRARY})逻辑说明NO_DEFAULT_PATH很关键它让find_library不去搜索系统默认目录避免找到/usr/lib/libgmp.so。如果你既想用系统动态库又想用静态库这个参数就按需求去掉。这里NAMES写成gmp libgmpCMake 会拼出libgmp.a或libgmp.so因为我们的目录里只有.a所以选到静态库。如果你想在 CMake 里同时使用 C 接口给libgmpxx.a也定义变量并且要注意target_link_libraries的顺序libgmpxx.a依赖libgmp.a所以链接顺序应该先写GMPXX_LIBRARY再写GMP_LIBRARY。这一点非常容易踩坑。4.3 链接顺序和依赖库的问题GCC 的静态库链接顺序是“从左到右、不断解析未定义符号”。在命令行里源文件/目标文件放在左边库放在右边如果库 A 依赖库 B那么库 B 必须放在 A 的右边。# 正确先源文件再 libgmpxx.a再 libgmp.a gcc -o demo demo.cpp -I/usr/local/gmp_static/include \ /usr/local/gmp_static/lib/libgmpxx.a \ /usr/local/gmp_static/lib/libgmp.a # 错误库顺序写反会出现 undefined reference gcc -o demo demo.cpp -I/usr/local/gmp_static/include \ /usr/local/gmp_static/lib/libgmp.a \ /usr/local/gmp_static/lib/libgmpxx.a为什么因为链接器从一个文件开始扫描当它遇到libgmp.a时发现还没有任何未解析符号于是就不会提取任何.o等后面遇到libgmpxx.a时发现引用了__gmpz_add等等但前面那个libgmp.a已经扫描过去了链接器不会回头再搜于是报 undefined reference。解决办法除了调顺序也可以用-Wl,--start-group把库包起来让链接器循环搜索gcc -o demo demo.cpp -I/usr/local/gmp_static/include \ -Wl,--start-group /usr/local/gmp_static/lib/libgmpxx.a /usr/local/gmp_static/lib/libgmp.a -Wl,--end-group能不用--start-group就不用它会让链接变慢但确实能救一些糟糕的依赖顺序。运行时验证静态链接是否成功用以下命令file test_gmp ldd test_gmp如果输出里只有linux-vdso和libc说明 GMP 已经静态链进去了如果你看到libgmp.so相关说明链接时悄悄用了动态库。使用-static后file通常会输出statically linked。这里有一个可移植性的提醒静态链接 GMP 后可执行文件对 kernel 的mmap、mprotect有依赖极老的嵌入式系统上有可能跑不起来但不属于常见的部署场景。5. GMP 静态库使用避坑清单五个高频现场与排查路径5.1 现象编译成功但运行报错 undefined symbol__gmpz_add这个现象常见于你手动指定了静态库但可执行文件运行时却报找不到__gmpz_add。运行时报undefined symbol一般发生在动态加载场景比如你编译了一个.so它引用了 GMP而宿主程序没有链接 GMP或者 GMP 库版本过旧。如果是静态链接的可执行文件通常不会在运行时缺符号除非你是用dlopen加载了一个依赖 GMP 的插件。原因静态链接时链接器只提取被引用的目标文件如果某个目标文件里有一个符号没有解析成功它应该早在链接期报错运行时报错多是因为可执行文件里的符号没有被导出或者动态加载器没找到依赖库。解决静态链接的可执行文件用-rdynamic导出符号或把依赖 GMP 的代码直接编译进主程序而不是插件如果是动态加载场景主程序也要链接 GMP或者让插件依赖一个明确路径的 GMP 动态库。用nm检查一下库里有没有该符号nm /usr/local/gmp_static/lib/libgmp.a | grep __gmpz_add如果 nm 结果正常说明库没事问题出在链接顺序或目标文件确实没被提取。5.2 现象链接时找不到 libgmp.so 但明明有 libgmp.a你可以跑ls看到libgmp.a就在那但gcc -o demo demo.c -lgmp依然报cannot find -lgmp。原因GCC 的-l选项会先找.so再找.a但它的搜索顺序只针对库文件名前缀如果你的.a不在标准搜索路径默认找不到。另外有些发行版把libgmp.a放在/usr/lib/x86_64-linux-gnu/但链接器没有那个路径。解决显式给出静态库路径或者给 gcc 加-L/usr/local/gmp_static/lib并确保目录下没有.so文件。更稳妥的还是像第 4 章那样直接写.a的文件路径。如果坚持用-l也可以强制静态gcc -o demo demo.c -I/usr/local/gmp_static/include \ -L/usr/local/gmp_static/lib -Wl,-Bstatic -lgmp -Wl,-Bdynamic-Wl,-Bstatic告诉链接器接下来的库只选静态版本-Wl,-Bdynamic恢复默认。但要注意如果你后面还链其他库顺序错了会把 libc 也静态掉。5.3 现象Windows 下用 MinGW 编译 GMP 失败很多人想在 Windows 下编译 GMP直接用 MinGW 运行./configure结果各种报错。GMP 官方提供的是面向 Linux 的 Makefile 测试Windows 通常要依赖 MSYS2 或 Cygwin 环境。原因GMP 的汇编优化代码是基于 ELF 的Windows 的 PE 格式和调用约定不同configure 在检测汇编器时认为不可用另一个常见问题是缺少m4和yasmconfig.log 里会看到m4: command not found。解决最省事的是用 MSYS2 的 mingw-w64 前缀来配置# 在 MSYS2 UCRT64 环境中安装工具链和 GMP 包 pacman -S mingw-w64-ucrt-x86_64-gcc base-devel # 或者直接安装预编译的 GMP pacman -S mingw-w64-ucrt-x86_64-gmp如果你真的要从源码编译我建议把 configure 的汇编关掉用 C 语言实现兜底./configure --buildx86_64-w64-mingw32 --disable-assembly make -j4注意--disable-assembly会让大数计算性能降低 20% 到 50%但在 Windows 上求运行正确是第一位的。如果你做的是跨平台产品尽量在 CI 里用 Linux 静态编译然后把产物拷贝到 Windows 上使用因为 MinGW 交叉编译出的静态库在 MSVC 程序里不能直接链接两者 ABI 不同。5.4 现象mpz_init 忘记释放导致内存暴涨GMP 的对象你可能觉得“就是个变量”但mpz_t内部有指向堆的指针初始化时分配了一段尾巴运算后它的_mp_d指针会指向更大内存块。如果你在循环里不断mpz_init不clear内存会持续增长现象是程序跑的越久 RSS 越大最后 OOM。原因不讲卫生。GMP 并不帮你自动释放C 接口尤其如此。解决把初始化和清理写成固定组合mpz_t t; mpz_init(t); ... mpz_clear(t);如果用批量接口就写mpz_inits(...) ... mpz_clears(...)。更极端的做法是给项目写一个 RAII 宏或 C 封装比如#define GMP_GUARD(name) mpz_t name; mpz_init(name); #define GMP_UNGUALD(name) mpz_clear(name);但这宏写不好会漏所以我个人更推荐在 C 代码里直接用mpz_class析构函数会帮你干这件事。静态库链接时mpz_class需要多链一个libgmpxx.a别漏了。5.5 现象中文文档里的函数名与新版不符老教程里经常出现mpz_random、mpz_random2你在 GMP 6.2.1 里直接编译会报“隐式声明”运行结果也不是期望的随机数。因为 GMP 用随机数状态gmp_randstate_t取代了老的全局随机接口。原因文档和代码版本脱节。网上很多中文资料写于 2010 年前后GMP 6.0 才做接口清理。解决把文档中的函数名对照官方NEWS文件和gmp.h中的注释改掉。比如mpz_random对应新版是mpz_urandomb或mpz_rrandomb它们都需要先初始化gmp_randstate_tgmp_randstate_t state; gmp_randinit_default(state); mpz_urandomb(rand, state, 256); gmp_randclear(state);此外因为 GMP 的头文件里包含版本宏你可以在代码最前面帮旧文档用户做一个编译期保护#if __GNU_MP_VERSION 6 #error 请使用 GMP 6.x老接口已废弃 #endif这样至少不会在符号层面踩坑。6. 把 GMP 静态库用得更顺的四个技巧第一招用版本宏做条件编译。GMP 在gmp.h里定义了__GNU_MP_VERSION、__GNU_MP_VERSION_MINOR和__GNU_MP_VERSION_PATCHLEVEL我写项目时会在关键接口前加判断比如随机数接口只在__GNU_MP_VERSION 6时启用新写法老版本回退到宏兼容层这样同一份代码能同时应对开发机和客户部署机上的不同 GMP 版本。第二招写一个薄封装。C 接口容易漏释放我会在内部代码里用mpz_class但对外导出的 C API 仍然接收const char*和unsigned char*由封装层负责转换。这样既享受了 RAII又不强迫下游调用方引入 C 运行时。封装层只用头文件实现方便静态库一起打进去。第三招做性能测量。GMP 的汇编优化很依赖配置同一段模幂运算./configure --enable-fat编译出的库能在多个 CPU 上跑但性能略低于-marchnative特调版本。我的习惯是 CI 里编两份发行版用--enable-fat内部压测用-marchnative。测量时用mpz_urandomb生成几个 2048 位随机数反复跑mpz_powm看时间不要只凭“感觉快”。第四招交叉编译时别拿错库。ARM 交叉编译要用--hostaarch64-linux-gnu --with-sysroot...然后把头文件和.a放进 sysroot。很多人直接把自己 x86 机器上编出的静态库复制到 ARM 设备上结果Segmentation fault。我在一次工业控制器项目里吃过这个亏后来坚持每次交叉编译都先跑make check并通过file查看库的架构。我现在的习惯是每次编译 GMP 之后先把make check跑通再在项目里用gmp_printf打印版本号确认链接的是预期库。这条路我踩过不少坑希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

工业级电源路径智能管理:TPS259483与PIC18F67K40协同设计

工业级电源路径智能管理:TPS259483与PIC18F67K40协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/29 9:39:52
Neo4j社区版Windows解压包实战:从启动到中文环境避坑指南

Neo4j社区版Windows解压包实战:从启动到中文环境避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/29 9:39:52
基于TPS259483与STM32L041C6的电源路径保护方案设计

基于TPS259483与STM32L041C6的电源路径保护方案设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/29 9:39:52
MORE NEWS

更多资讯

📰

GPU加速TTI正演与逆时偏移:CUDA实现与ADCIGS生成

简介:面向地震波场模拟与高性能计算方向的研究者与工程师,这份资源聚焦二维TTI各向异性介质下的有限差分正演与逆时偏移实现,并借助CUDA将计算密集的波场传播与成像过程迁移到GPU并行加速,适合已具备波动方程与有限差分基础、希望…

📰

PFMEA入门实战:从过程流程图到控制计划的完整指南

简介:这是一份面向制造业质量工程师、工艺开发人员及质量管理入门者的PFMEA培训课件,聚焦过程潜在失效模式及后果分析这一核心工具,帮助读者理解并掌握过程风险识别、评估与改善的完整方法。资源包内含1个PPT文件,压缩包约581KB&a…

📰

【贪心交换排序】题解:P11376 [GESP202412 六级] 运送物资_贪心模型_排序_模拟_C++算法竞赛

文章目录题目描述题解时间限制1.00s内存限制512.00MB提供者沉石鱼惊旋难度普及/提高−标签贪心排序GESP2024题目描述 小杨管理着 mmm 辆货车,每辆货车每天需要向 A 市和 B 市运送若干次物资。小杨同时拥有 nnn 个运输站点,这些站点位于 A 市和 B 市之间…

📰

【CPU】Hypervisor 中 LHP / LWP 问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

开拓者:正义之怒 职业构建:3步走完开卡到毕业

开拓者:正义之怒 职业构建:3步走完开卡到毕业 【免费下载链接】Wotr-BD-LR 正义之怒Wotr主角BD搜集 项目地址: https://gitcode.com/GitHub_Trending/wo/Wotr-BD-LR 本文是 开拓者:正义之怒 职业构建 实战攻略,基于 Wotr-B…

📰

[Web3] 去中心化基石 - BIP铁三角(BIP32/39/44)

🏗️ 去中心化的身份基石:BIP 铁三角(BIP32 / BIP39 / BIP44) 很多年前,我们初次接触互联网或社会时,总是需要向中心化机构“申请身份”: 👤 注册 QQ 账号、游戏账号;&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬