ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序。 html
ZThread库的主页:http://zthread.sourceforge.net linux
最新版本Zthread远吗下载地址: http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz 函数
ZThread文档:http://zthread.sourceforge.net/documentation.html spa
1、在Windows下使用ZThread .net
首先,下载ZThread,解压到某个目录下,我解压到D:\libs\ZThread-2.3.2\中。 指针
方法1:包含源文件直接编译(不推荐) code
1.在vs2010中,新建一个新的win32 控制台项目,选择空项目。 htm
2.在源目录下新建一个main.cpp文件,在http://zthread.sourceforge.net/html/classZThread_1_1Thread.html 中复制一段示例代码拷贝到main.cpp中。 对象
3.在项目的配置属性中,VC++目录的包含目录中增长ZThread的头文件目录,我这里是:D:\libs\ZThread-2.3.2\include。配置属性分DEBUG和RELEASE两个,默认选择的是DEBUG配置,但最好两个都配置一下,不然生成RELEASE版本时会报错 unicode
4.在项目中新建一个文件夹,名字随意,个人叫ZThread,而后选择这个文件夹,右键选择添加->现有项,将ZThread解压目录中的src目录的全部cxx文件都加入到这个目录中
而后如今能够编译了,正常来讲,应该编译经过而且成功启动程序了。
但也有可能出现一些错误:
错误一:error C2664: “GetModuleHandleW”: 不能将参数 1 从“const char [13]”转换为“LPCWSTR”
这个是因为vs2010的项目设置默认采用了unicode字符集致使的,能够在项目属性中将字符集改成多字节便可,也能够在GetModuleHandle函数的字符串参数加上_T()包含,改成GetModuleHandle(_T("Kernel32.dll"));
方法2:编译成静态库
1.在vs2010中,新建一个新的win32 控制台项目,我取名为ZThread.,项目类型选择为静态库。
2.在项目的配置属性中,VC++目录的包含目录中增长ZThread的头文件目录,我这里是:D:\libs\ZThread-2.3.2\include。配置属性分DEBUG和RELEASE两个,默认选择的是DEBUG配置,但最好两个都配置一下,不然生成RELEASE版本时会报错
3.在项目源目录中,右键选择添加->现有项,将ZThread解压目录中的src目录的全部cxx文件都加入到这个目录中
而后如今能够编译了,正常来讲,应该编译经过而且成功生成了ZThread.lib静态库。
但也有可能出现一些错误:
错误一:error C2664: “GetModuleHandleW”: 不能将参数 1 从“const char [13]”转换为“LPCWSTR”
这个是因为vs2010的项目设置默认采用了unicode字符集致使的,能够在项目属性中将字符集改成多字节便可,也能够在GetModuleHandle函数的字符串参数加上_T()包含,改成GetModuleHandle(_T("Kernel32.dll"));
静态库的使用方法是:
在咱们的程序的工程属性的VC++目录的包含目录中,增长ZThread的头文件目录。
在程序代码中,增长#pragma comment(lib, “ZThread.lib”)声明,同时,须要将ZThread.lib文件放在咱们的源目录下,跟代码放一块儿。
方法3,编译成动态库DLL
跟方法2差很少,只不过项目类型选择为动态库。其余步骤同样,再也不详述,编译成功后,会生成ZThread.lib, ZThread.dll。
使用动态库的方法跟静态库一致,不一样的是,使用动态库的程序在运行时须要ZThread.dll文件。
至此,静态连接库和动态连接库咱们就说完了,咱们作一下对比和补充:
两个lib文件的不一样
咱们发现,不管是静态连接库仍是动态连接库,最后都有lib文件,那么二者区别是什么呢?其实,两个是彻底不同的东西。两个ZThread.lib大小都不一样,静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库。实际上静态库自己就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
对于静态连接库,咱们在编译和连接的时候已经将全部的代码都导入进来,所以,当生成可执行文件之后,可执行文件包含全部的代码。所以,在可执行文件运行时就再也不须要静态库了,这也是为何咱们删掉ZThread.lib程序照样执行;而对于动态连接库,实际上,可执行文件不包含DLL中的内容,只是经过导入库(.lib)知道了相应的地址信息,所以,可执行文件在运行时动态得去加载DLL,这也是为何咱们删掉ZThread.dll后程序就不能执行了。
对于DLL,咱们是能够不要lib文件的。若是不要lib文件,咱们能够经过函数指针的使用达到咱们的目的。
2、在Linux下使用ZThread
在linux下,直接经过三部曲就能够完成了,很是简单
./configure
./make
./make install
若是在make时遇到错误:
../include/zthread/Guard.h: In destructor 'ZThread::Guard<LockType, LockingPolicy>::~Guard()':
../include/zthread/Guard.h:494: error: there are no arguments to 'isDisabled' that depend on a template parameter, so a declaration of 'isDisabled' must be available
只需 先export CXXFLAGS=-fpermissive,而后再执行
./configure
./make
./make install
就能够了