Windows下pthread静态库的编译
一、写在前面
官方网站提供的pthread-win32下载链接里面给到的是dll文件,属于动态库文件,即使在自己写的工程中已经配置了“/MT”,即多线程静态链接,但是在其他电脑当中使用该程序的时候,还是会报错找不到dll文件的问题,故干脆直接看看能不能找到一份pthread-win32的静态库文件,这样都一齐编译进自己的工程当中,省的还需要提供dll文件到其他电脑使用。
这里记录一下自己在编译pthread-win32当中的步骤。
二、下载链接
主要源码来源有这些地方:
1、pthread-win32的GitHub仓库,截至2024.9.24,最新版本为3.1.0
2、pthread-win32的Sourceware链接,截至2024.9.24,最新版本为2.9.1(这里Sourceware的页面当中,可以找到对应的ftp链接,如果打不开这个链接,直接将ftp改为https,再访问就可以了)
下载之后解压图片如下所示,文件很多的这个是Github仓库下载的,只有三个文件夹的是Sourceware仓库下载的


由于我不太清楚该怎么去编译Sourceware下载得到的文件,故这里只提供别人对这个文件当中的解释,参考链接:
https://www.cnblogs.com/lzhu/p/12032783.html
https://blog.csdn.net/weixin_54730871/article/details/131387382
我只在这里进行详细解释Github仓库下载的内容
三、Github仓库源码编译
打开下载文件路径下的windows文件夹,选择对应的电脑Visual Studio版本,我这里用的是VS2022。
继续打开pthread.2022.sln,分别对“pthread_dll”和“pthread_static_lib”进行右击,然后点击生成,即可。
最后在路径"VS2022->-bin->Debug-Unicode-64bit-x64"文件夹下面可以找到编译生成的dll文件和lib文件
不得不说使用visual studio已经串联起来的工具链来生成对应的库文件真是太方便了,这里还是想吐槽一下从Sourceware下载来的源码文件,我真的不清楚该怎么去编译生成QAQ,Sourceware下载来的源码当中的工程甚至是VS++ 6.0的,太离谱了。
四、pthread-win32动态库、静态库的使用
1、动态库使用
在"VS2022->-bin->Debug-Unicode-64bit-x64"路径下可以找到生成的lib文件和dll文件,动态库需要使用到当中的2个文件,分别是"pthread.dll"和"pthread.lib"

在创建的测试工程当中将包含目录和库目录添加进去即可,如图所示:

再在附加依赖项当中添加"pthread.lib",如图所示:

最后将"pthread.dll"放在工程的同级目录下即可,如图所示:

最后编译出来的exe文件也需要这个dll文件才能够正常执行。
2、静态库使用
对于静态库使用,除了添加包含目录和库目录之外,只需将附加依赖项修改为"pthread_static_lib.lib"即可,不需要dll文件来帮助寻找函数声明了,如图所示:

五、测试程序
配置完之后进行程序测试,这里使用到了线程创建和互斥锁的功能,创建多线程输出"hello",使用互斥锁防止线程之间相互打断
#include <pthread.h>
#include <iostream>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁初始化
// 线程函数
void* threadFunc(void* arg) {
int id = *(int*)arg;
// 锁定互斥锁,保证一次只会有一个线程输出
pthread_mutex_lock(&mutex);
std::cout << "Hello from thread " << id << std::endl;
pthread_mutex_unlock(&mutex); // 解锁互斥锁
return nullptr; // 返回空指针
}
int main() {
pthread_t threads[5]; // 创建5个线程
int threadIds[5];
// 初始化线程并创建它们
for (int i = 0; i < 5; i++) {
threadIds[i] = i + 1;
int result = pthread_create(&threads[i], nullptr, threadFunc, &threadIds[i]);
if (result != 0) {
std::cerr << "Error creating thread " << i + 1 << std::endl;
return -1;
}
}
// 等待所有线程结束
for (int i = 0; i < 5; i++) {
pthread_join(threads[i], nullptr);
}
std::cout << "All threads completed." << std::endl;
return 0;
}
能正常输出就没问题了~~ ,如图所示。
这里输出的线程顺序不一定一致,因为线程的配置使用的底层来决定的。

六、写在最后
如果对大家有帮助,给我点个赞吧,谢谢~
七、Visual Studio 设置(2024.9.29补充)
一、
这个静态库似乎只能在Visual Studio 2022 的配置为:debug x64 的时候才能正常使用,否则会报错:

具体原因不清楚。。。。。。
我也好想解决这个问题啊
二、找到原因了
在编译静态库的时候,记得将模式选择为Release。。。这样编译出来的才是适合Release版本使用的静态库。
至此,应该全部结束了。。。
Windows下pthread静态库的编译的更多相关文章
- windows下sqlite3静态库和动态库的编译
1.下载sqlite3源码:http://www.sqlite.org/download.html 主要是sqlite-amalgamation-XXXXXXX.zip.sqlite-dll-win3 ...
- 在Windows下制作静态库和动态库
一:静态库的创建 VC++6.0中new一个的为win32 static library工程,之后有二个选项.根据需求选吧. 具体的类或者函数的添加过程和标准的工程一样,直接创建新的类或者添加新 的. ...
- windows下查看静态库和动态库的导出函数
在window下查看动态库的导出函数可以用vs自带的Depends工具: 查看静态库的信息要用命令行来实现: dumpbin /LINKERMEMBER Test.lib > 1 ...
- Windows下使用静态库
开发工具 vs2010 1.新建win32控制台应用程序 2.将静态库的头文件包括在程序中并手动链接静态库(库文件和头文件都在根文件夹下) watermark/2/text/aHR0cDovL2Jsb ...
- Windows下使用Visual Studio 2010编译ffmpeg全过程
在visual studio 2010中调用ffmpeg http://blog.sina.com.cn/s/blog_4178f4bf01018wqh.html Windows下使用Visual S ...
- linux下的静态库和共享库
转载&&增加: 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...
- linux系统环境下的静态库和动态库的制作
linux系统下的应用编程需要系统提供的库文件,包括静态库或动态库.不管是静态库还是动态库,都是编译好的二进制文件.在我们编译程序时要链接的目标文件,静态库是链接的时候直接编译到程序里,和程序成为一体 ...
- linux下的静态库和动态库
一.linux下的静态库 静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在! 二.linux下动态库的构建和使用 1.动态库的构建 ...
- Python语言、编译解释、动态库静态库、编译过程、头文件
学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...
- 配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp
配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境&quo ...
随机推荐
- 13. Advanced-control timers (TIM1 and TIM8)
1. 基本介绍 有三个基础的寄存器: 计数寄存器(TIMx_CNT,Counter register) 预分频寄存器(TIMx_PSC,Prescaler register) 自动重载寄存器(TIMx ...
- 嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门
在<嵌入式数据库sqlite3命令操作基础篇-增删改查,小白一文入门>一文中讲解了如何实现sqlite3的基本操作增删改查,本文介绍一些其他复杂一点的操作.比如where.order by ...
- 【VMware VCF】VMware Cloud Foundation Part 07:管理工作负载域中的主机和集群。
一个标准 VMware Cloud Foundation 实例中具有管理工作负载域和 VI 工作负载域两种类型,管理域有且只有一个,而 VI 域可以创建多个,每种工作负载域中可以具有多个 vSpher ...
- Java微信授权登录小程序接口
1.微信授权登录小程序的流程是什么 微信授权登录小程序的流程是一个涉及前端和后端交互的过程,主要目的是让用户能够使用微信账号快速登录小程序,避免重复输入用户名和密码.以下是该流程的详细步骤: 1.1前 ...
- ZABBIX Maps(拓扑图) 数据可视化
本篇文章将介绍如何利用zabbix内置 Maps模块展示主机数据指标以及如何关联触发器 构建业务地图让异常指标更加直观呈现 下面我将从网络设备.服务器和vmware esxi和IP主机去为大家解析za ...
- 淘宝api接口,淘宝开放平台api接口
目前淘宝开放平台是暂停入驻的,正常情况来说,用这个接口的人是为了打单发货,但是由于淘宝暂停入驻,所以大家也无法接入了. 目前本人手头有很早申请好的可以使用的接口,可以用于以下用途: 1.淘宝订单打单发 ...
- 消息队列的对比测试与RocketMQ使用扩展
消息队列的对比测试与RocketMQ使用扩展 本文的主要内容包括以下几个方面: 原有的消息技术选型 RocketMQ与kafka 测试对比 如何构建自己的消息队列服务 RocketMQ扩展改造 ...
- InfoTS: 具有信息感知增强的时间序列对比学习《Time Series Contrastive Learning with Information-Aware Augmentations》(对比学习、信息感知增强、高保真、多样性、信息论-信息瓶颈、元学习器)(没看懂,还需要再回顾)
现在是2024年5月23日,14:30,开始看论文. 论文:Time Series Contrastive Learning with Information-Aware Augmentations ...
- CSS & JS Effect – Statistics Counter
效果 当 scroll 到那些号码的时候, 号码从 0 开始跳动, 一直到最终的值. 实现思路 1. 一开始把号码 set to 0 2. 使用 IntersectionObserver 监听号码出现 ...
- Azure – DNS
前言 以往 DNS 都是用 Domain 公司免费提供的. 但这类 DNS 一般都不支持 API 访问. 这就会导致无法自动 renew Let's Encrypt wildcard SSL. 所以用 ...