背景
用vs2017写点window上用的小工具,为了体验良好,用了线程,然鹅,换人电脑一点开!
砰~弹窗
呵呵~
不想这小一个工具还搞个安装包带上dll!
所以,我们来搞静态!!!
一、我叫MT
/MT是 "multithread, static version ” 意思是多线程静态的版本
我们要做的,就是将所有的项目属性都改成MT,对,所有!!!
工具exe属性修改
找到你的项目属性–>c/c++–>代码生成–>运行库
选择多线程 (/MT)
ps:
线程库使用MT
错误示范一
- 首先看看下载pthread库,在如下目录找了pthreadVC2.lib
pthreads-w32-2-9-1-release\Pre-built.2\lib\x64 - 然后,将pthreadVC2.lib拷贝到当前项目下,新建一个Lib目录
- 找到项目属性–>链接器–>常规–>附加库目录–>./Lib
- 找到项目属性–>链接器–>输入–>附加依赖项–>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语言
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处!
更多精彩内容,欢迎访问一只海星的主页