一只海星的主页

VS2017线程库pthread-win32使用静态库-不需要pthreadVC2.dll

背景

用vs2017写点window上用的小工具,为了体验良好,用了线程,然鹅,换人电脑一点开!
砰~弹窗

呵呵~

不想这小一个工具还搞个安装包带上dll!

所以,我们来搞静态!!!

一、我叫MT

/MT是 “multithread, static version ” 意思是多线程静态的版本

我们要做的,就是将所有的项目属性都改成MT,对,所有!!!

工具exe属性修改

找到你的项目属性–>c/c++–>代码生成–>运行库
选择多线程 (/MT)

ps:

线程库使用MT

错误示范一

  1. 首先看看下载pthread库,在如下目录找了pthreadVC2.lib
    pthreads-w32-2-9-1-release\Pre-built.2\lib\x64
  2. 然后,将pthreadVC2.lib拷贝到当前项目下,新建一个Lib目录
  3. 找到项目属性–>链接器–>常规–>附加库目录–>./Lib
  4. 找到项目属性–>链接器–>输入–>附加依赖项–>pthreadVC2.lib
    重新编译、运行、一气呵成~

    呵。。。

所以,我们需要自己生成真正的pthread静态Lib

二、pthread-win32 搞源码

下载

有版本需求的同学请点官网
想乘坐电梯的同学点我

编译

  • 打开 pthread.2015.sln
  • 找到pthread_lib
  • 修改pthread_lib属性MT
    不知道怎么改的同学往上看,工具exe属性修改
  • 重新编译
    在pthread-win32-master\bin\x64_MSVC2015.Release目录下生成的pthread_lib.lib就是我们要的!

添加新库

不知道怎么添加的同学往上看,错误示范一

又是,重新编译、二气呵成~

呵呵。。。

错误示范一

因为我的exe和线程库中间还隔了一个库,
一通各种添加#pragma comment(lib, “pthread_lib.lib”)
然。。

错误示范二

因源码版本和release的版本不同,各种替换不同版本头文件
然。。

错误示范三

各种修改编译属性
然。。

原来如此

一通搜索,搞清楚了windows的lib和dll套路

在生成dll文件(动态库文件)时,如果不使用_declspec(dllexport)那么就只有dll文件,在这种情况下就无法使用#pragma comment来隐式装载动态库(因为需要lib文件),只能使用LoadLibrary来显式装载动态库(使用Loadlibrary只需要dll文件

简单点说就是,使用_declspec(dllexport)的dll会生成对应的lib文件,这个lib类似都文件的声明,只是一个符号导出,链接的时候还是需要dll!!

错误提示,这就是找不到符号,符号是头文件定义的,我们来看看头文件的定义!

打开pthread.h,看到这个

Get!
静态库不需要declspec(dllexport)!
静态库不需要declspec(dllexport)!
静态库不需要declspec(dllexport)!

添加PTW32_STATIC_LIB预处理器命令

找到项目属性–>c/c++–>预处理器–>预处理器定义–>PTW32_STATIC_LIB

又是,重新编译、运行、三气呵成~

全部重新生成: 成功 1 个,失败 0 个,跳过 0 个

总结

1.如果需要一个exe包含所有,记得选/MT,所有依赖库都必须选!
2.pthread-win32的release版本都是dll,如需使用pthread-win32静态库使用源码重新编译!
3.头文件不需要declspec(dllexport),如pthread-win32请添加PTW32_STATIC_LIB宏定义

伸手电梯直达

pthread-win32静态库release-x64版本下载,点我
使用请增加PTW32_STATIC_LIB!!!

参考

VS2017生成一个简单的DLL文件 和 LIB文件——C语言

发表评论

邮箱地址不会被公开。 必填项已用*标注