当前位置: 首页 > news >正文

依赖p4est库的程序windows运行方法----支持vs2022调试

一.前置环境

1.vs2022且包含CLangCL工具集,没有安的在vs的intaller里边修改已安装的vs2022,在右侧目录里勾选上(使用c++进行桌面开发/适用于windows的C++Clang工具)。

2.安装MS-MPI,安在默认位置即可(https://www.microsoft.com/en-us/download/details.aspx?id=57467)这一步将msmpisdk.msi和msmpisetup.exe分别安装。

3.下载Cmake

二.获取p4est源码(这一步需要注意了)

1.这是p4est作者提供的网址(https://github.com/cburstedde/p4est/blob/master/INSTALL_WINDOWS)进去后下载源代码库的压缩包,坑人的一点来了,就是下图中蓝色的sc@81b9596它不在下载的压缩包中,所以还得单独把sc(这才是p4est的主要include库)下载下来。解压后改名为sc复制到p4est-master里边。

三.p4est的windows库文件生成(最难的一步)

这一步的参考文献(虽然不能直接用,但是有一定参考价值)为https://blog.csdn.net/2301_81647724/article/details/146335796

1.为了适应windows系统得做一些代码的修改,首先在vscode里边打开整个p4est-master文件夹

(1)p4est_algorithms.c的50行,p4est_ghost.c的52行,p6est.c的53行,p6est_ghost.c的26行,p8est_algorithms.c的26行,p8est_ghost.c的28行添加

#define htonl(_val) ( ((uint16_t)(_val) & 0xff00) >> 8 | ((uint16_t)(_val) & 0xff) << 8 )

(2)p4est作者说的这些

File sc/src/sc.h line 96://#include <libgen.h>

File sc/src/sc.h line 121: #define __attribute__(x)

File sc/test/test_node_comm.c line 36: #define srandom srand #define random rand In files src/p4est_algorithms.c, p8est_algorithms.c, p6est.c Include definitions of htonl-function #define htonl(_val) ( ((uint16_t)(_val) & 0xff00) >> 8 | ((uint16_t)(_val) & 0xff) << 8 )

File test/test_balance_seeds2.c line 33: #define srandom srand #define random rand

都改了就行

(3)然后进行Cmake 在./p4est-master文件夹下建立一个build的文件夹,跟参考不同的就是勾上MPI,去掉ZLIB,MPI路径需要设置你就设置成MS-MPI的俩路径就行,跟我一样应该就不用设置了。configure+generate+open project依次点击等待就行,然后就生成项目进入vs2022了。

在这生成解决方案会报一个basename错误,不要慌,我们得在(sc_containers.c)文件末尾加上

#ifdef _WIN32 #include <string.h> /* Provide a basename implementation for Windows. Returns the last component of a path. The original string is not modified. */ char* basename(char* path) { char *p = strrchr(path, '/'); if (!p) p = strrchr(path, '\\'); return p ? p + 1 : path; } /* Provide dirname if needed */ char* dirname(char* path) { char *p = strrchr(path, '/'); if (!p) p = strrchr(path, '\\'); if (!p) return "."; *p = '\0'; return path; } #endif

在(sc/src/sc.h)中加上(所有的include之后

#ifdef _WIN32 char* basename(char* path); char* dirname(char* path); #endif

这个时候重新生成解决方案应该就成功了,如果有其他错误就上网搜搜或者问问AI,应该可以解决,大概率就是前面改成windows适用版本的细节我忘记了一部分。

四.p4est.lib和sc.lib(第三步得到的东西)的使用

建议先用vs2022命令行测试,打开x64 Native Tools Command Prompt for VS 2022然后编译运行一个测试文件

这里说一下编译命令哦,可能有好多人不会命令行测试(为了保护我的隐私路径是需要你自己改成自己的,大家应该看得懂)

cl p4est_step1.c ^ /I"***\p4est-master\src" ^ /I"***\p4est-master\sc\src" ^ /I"***\p4est-master\build\sc\include" ^ /I"***\p4est-master\build\include" ^ /I"C:\Program Files (x86)\Microsoft SDKs\MPI\Include" ^ /DSC_HAVE_MPI /DP4EST_HAVE_MPI ^ /MDd ^ /Fe:test_p4est_basic.exe ^ ***\p4est-master\build\Debug\p4est.lib ^ ***\p4est-master\build\sc\Debug\sc.lib ^ "C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64\msmpi.lib"

我也把我的测试文件贴出来了

#include <mpi.h> #include <stdio.h> #include <stdlib.h> /* 包含 p4est 3D 接口(通过宏转为 p8est) */ #include <p4est_to_p8est.h> #include <p8est_extended.h> #include <p8est_iterate.h> /* 自定义数据结构:存储单元中心坐标和体积 */ typedef struct { double center[3]; double volume; } user_data_t; /* 初始化函数:在新建单元时调用 */ static void init_quadrant(p4est_t* p4est, p4est_topidx_t which_tree, p4est_quadrant_t* q) { user_data_t* data = (user_data_t*)q->p.user_data; double midpoint[3]; /* 获取单元中心坐标(3D) */ p8est_quadrant_centroid(p4est->connectivity, which_tree, q, midpoint); >***\p4est-master\src ***\p4est-master\sc\src ***\p4est-master\build\sc\include ***\p4est-master\build\include C:\Program Files (x86)\Microsoft SDKs\MPI\Include

(4)链接器 → 常规 → 附加库目录,添加:

***\p4est-master\build\Debug ***\p4est-master\build\sc\Debug C:\Program Files (x86)\Microsoft SDKs\MPI\Lib\x64

(5)链接器 → 输入 → 附加依赖项,添加:

p4est.lib sc.lib msmpi.lib

(6)C/C++ → 预处理器 → 预处理器定义,添加:

SC_HAVE_MPI P4EST_HAVE_MPI _CRT_SECURE_NO_WARNINGS _USE_MATH_DEFINES ssize_t=int

(7)右键 → 属性 → 配置属性 → 常规 → 平台工具集 → 选择ClangCL

(8)此时运行typedef SSIZE_T ssize_t;会报错,解决办法就是在sc.h文件中注释掉我所注释的部分,加上我所加的部分即可

////#ifdef SC_HAVE_UNISTD_H ////#include <unistd.h> ////#elif defined _WIN32 ////#include <BaseTsd.h> ////typedef SSIZE_T ssize_t; ////#endif #ifdef _WIN32 #ifndef ssize_t #ifdef _MSC_VER typedef long long ssize_t; #else typedef long ssize_t; #endif #endif #endif

这样就大功告成啦,你就可以在vs2022中运行调试你自己编写但依赖p4est库的程序了!!!!

http://www.jsqmd.com/news/578724/

相关文章:

  • 独立站建站成本全解析
  • TC630 3BSE002253R1 控制器模块
  • Cuvil + HuggingFace Pipeline端到端加速实录:BERT-base推理延迟从142ms降至31ms的6个关键编译开关
  • Transformer架构详细解读(教程向)
  • Go的select语句:多路复用的channel操作
  • SEO优化和网络推广的关系是什么_如何利用知识付费平台进行网络推广
  • 2026年山东省首版次高端软件申报已经开始,中承信安助力企业快速申报
  • 音频转换与格式解密工具全解析:破解QQ音乐限制的批量处理方案
  • 从零开始学Flink:TopN 榜单
  • 从LVGL菜单组件反推:手搓一个轻量级C语言菜单框架(适合RTOS/单片机)
  • 本科毕业论文“通关秘籍”:好写作AI的神奇助力
  • 主流CRM系统盘点与选型:电商零售企业2026实战指南
  • STM32开发中的可执行文件格式解析:AXF、HEX与BIN
  • 8位单片机高效处理16位整数的4种方法
  • 我的编程之路
  • 确保在STA线程中运行
  • 】【】
  • COMSOL锂电池仿真入门教学:主要为电极单元的电化学-热耦合,也可以是电池包热仿真
  • 雕塑的安装方式(以玻璃钢为例)
  • rotary_encoder库深度解析:正交编码器状态机与嵌入式抗抖动实践
  • npm 发布报错 403 Forbidden(2FA)解决方案
  • Spring with AI (): 搜索扩展——向量数据库与RAG(下)
  • 收藏备用!大模型面试高频题:为什么有KV-Cache却没有Q-Cache?小白也能秒懂
  • ESP32S3+SPIFFS实战:5分钟搭建个人网盘(含前端完整代码)
  • 硕士毕业论文“攻坚利器”:好写作AI的全方位赋能
  • OpenClaw学习曲线:Kimi-VL-A3B-Thinking从入门到精通的30天记录
  • STV Group和Post-Quantum成功测试全球首款抗量子无人机
  • 数据处理与统计分析----沙箱
  • P2569 [SCOI2010] 股票交易s 题解
  • 第 4 章 列表数据类型 知识点精讲