在Window和Linux下使用Zthread库

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

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

就可以了

目录
相关文章
|
Linux 数据安全/隐私保护 Windows
命令方式:window向linux传文件
【10月更文挑战第6天】本文介绍了如何在Linux系统中通过命令`ip a`获取IP地址,并在Windows系统下使用CMD命令行工具和SCP命令实现文件传输。示例展示了如何将D盘中的`mm.jar`文件上传至IP地址为192.168.163.122的Linux系统的/up/目录下,最后在Linux系统中确认文件传输结果。
683 65
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
2090 141
|
6月前
|
Linux 编译器 vr&ar
Linux的动态库与静态库
静态库在编译时直接嵌入到最终的可执行文件中。
154 0
|
安全 Linux vr&ar
Linux的动态库和静态库
Linux的动态库和静态库
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
475 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
590 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
存储 Linux C语言
Linux|如何安装和运行多个 glibc 库
Linux|如何安装和运行多个 glibc 库
3861 5
|
Linux API
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
在Linux中,程序产生了库日志虽然删除了,但磁盘空间未更新是什么原因?
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
125 0
|
Linux 编译器 C语言
Linux中的pkg-config:简化库依赖管理的利器
**pkg-config**是Linux下管理库依赖的工具,它通过读取库的`.pc`文件提供编译和链接参数。使用`pkg-config --cflags --libs &lt;library&gt;`获取编译和链接选项,例如`gcc -o test test.c $(pkg-config --cflags --libs glib-2.0)`。能进行版本检查、参数提取、依赖管理和路径搜索。列出所有包用`pkg-config --list-all`。最佳实践包括确保库正确安装、检查版本、配置`PKG_CONFIG_PATH`及使用构建工具。