ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序。

ZThread库的主页:http://zthread.sourceforge.net

最新版本Zthread远吗下载地址: http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz

ZThread文档:http://zthread.sourceforge.net/documentation.html

一、在Windows下使用ZThread

首先,下载ZThread,解压到某个目录下,我解压到D:\libs\ZThread-2.3.2\中。

方法1:包含源文件直接编译(不推荐)

1.在vs2010中,新建一个新的win32 控制台项目,选择空项目。

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版本时会报错

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文件,我们可以通过函数指针的使用达到我们的目的。

二、在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

就可以了

在Window和Linux下使用Zthread库的更多相关文章

  1. 在Window和Linux下使用Zthread库(跨平台高级面向对象的线性和sycnchronization 库)

    ZThread库是一个开源的跨平台高级面向对象的线性和sycnchronization 库,以运行POSIX 和Win32 系统中的C++程序. ZThread库的主页:http://zthread. ...

  2. linux下安装uuid库

    1.linux 下安装UUID库 1.1)ubuntu下安装uuid链接库 sudo apt-get install uuid-dev 1.2)CentOS yum install libuuid-d ...

  3. linux下so动态库一些不为人知的秘密(转)

    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库, ...

  4. linux下so动态库一些不为人知的秘密

    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.    基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些 ...

  5. linux下so动态库一些不为人知的秘密(中二)

    继续上一篇< linux下so动态库一些不为人知的秘密(中) >介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只 ...

  6. linux下so动态库一些不为人知的秘密(中)

    上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题. 我们知道linux链接so有两种途径:显示和隐式.所谓显示就是程序 ...

  7. linux下so动态库一些不为人知的秘密(上)

    linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.        基本上每一个linux 程序都至少会有一个动态库,查看某个程序使 ...

  8. 如何在Linux下添加函数库

    如何为Linux增加库一. 静态库在Linux下的静态库是以.a为后缀的文件.1. 建静态库h1.c 源文件#include<stdio.h>void hello1(){printf(“t ...

  9. linux下的静态库和动态库

    一.linux下的静态库   静态库中的被调用的函数的代码会在编译时一起被复制到可执行文件中去的!!可执行文件在运行不需要静态库的存在!   二.linux下动态库的构建和使用 1.动态库的构建   ...

随机推荐

  1. 分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件

    原文:分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件 import java.util.zip.*; import java.io.*; public class Zip ...

  2. TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志

    TF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志     TF-IDF与余弦相似性的应用(一):自动提取关键词     作者: 阮一峰     日期: 2013年3月15日 ...

  3. Codeforces Round #258 (Div. 2) 小结

    A. Game With Sticks (451A) 水题一道,事实上无论你选取哪一个交叉点,结果都是行数列数都减一,那如今就是谁先减到行.列有一个为0,那么谁就赢了.因为Akshat先选,因此假设行 ...

  4. AsyncTask的用法总结

    这几天被AsyncTask虐得不行,在此总结下 首先: AsyncTask的参数介绍 在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占 ...

  5. iOS 获取当前时间以及计算年龄(时间差)

    获取当前时间 NSDate *now = [NSDate date]; NSLog(@"now date is: %@", now); NSCalendar *calendar = ...

  6. Eclipse用法和技巧十:显示代码outline

    在一个文件中快速找到某一个方法或者某一个作用域,可以使用 Ctrl+O或者Ctrl+F3,快速显示当前代码的outline,进行快速查找.效果如下:        这里主要是补充一些后续操作,能更加方 ...

  7. 关于python抓取google搜索结果的若干问题

    关于python抓取google搜索结果的若干问题     前一段时间一直在研究如何用python抓取搜索引擎结果,在实现的过程中遇到了很多的问题,我把我遇到的问题都记录下来,希望以后遇到同样问题的童 ...

  8. Javascript跨域请求的几种解决方法

    什么情况下才会出现跨域? 假设域名是:http://www.example.com.cn/ 如果所请求的域名跟这个域名不致,这种情况就是跨域,由于跨域存在漏洞,所以一般来说正常的跨域请求方式是请求不到 ...

  9. cocos2d-x在win32和iOS、android下获取当前系统时间的方法

    最近在游戏里要显示当前系统时间的功能,网上一搜很多写着获取的方法,大都是如下 struct cc_timeval now; CCTime::gettimeofdayCocos2d(&now, ...

  10. (原创)优酷androidclient 下载中 bug 解决

    在网络情况不好的情况下,优酷androidclient下载视频会终止,用户放弃下载点击 删除该任务以后,切换到网络好的情况下进行下载,会显示该视频已在下载队列里,然后clientUI界面却什么都看不到 ...