文章目录
POSIX 线程局限性
1. POSIX 线程局限性 : 在 Android , Linux , UNIX , MAC 中可以直接使用 POSIX , Windows 不可以直接使用 ;
2. Windows 配置 POSIX 线程 : 在 Visual Studio 上使用 POSIX 线程 , 需要引入第三方动态库 ;
POSIX 线程配置文件下载及目录说明
1. 下载 : POSIX 线程 Windows 配置文件下载地址 :
- ① 下载地址 1 : ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip ;
- ② 下载地址 2 : https://jaist.dl.sourceforge.net/project/pthreads4w/pthreads-w32-2-9-1-release.zip ( 推荐 ) ;
2. Pre-built.2 目录下的相关文件说明 :
- ① dll 目录 : 存放动态库目录 , 其中包含 64位 和 32位 两种动态库 ;
下图是 64 位动态库 :
下图是 32 位 动态库 :
- ② lib 目录 ; 存放静态库的目录 , 该目录也是同时包含 64 位 与 32 位 静态库 ;
- ③ include 目录 : 存放头文件的目录 ;
Windows 动态库与静态库
动态库与静态库文件说明 :
- ① dll 动态库文件说明 : 在 Pre-built.2\dll\x64 目录下 , 是 64 位操作系统的动态库文件 , Windows 上的动态库是 .dll 文件 , 在 Android , Linux 上的动态库是 .so 文件 ;
- ② lib 静态库文件说明 : 在 Windows 上静态库有两种 , 一种只是单纯的起到引导作用 , 引导如何去链接 dll 动态库 ; 另一种是直接定义了所有的静态函数 ;
POSIX 线程配置 ( 项目配置 )
1. 拷贝文件 : 将 Pre-built.2 目录下的 include 和 lib 两个目录拷贝到 CMakeLists.txt 所在目录中 ;
2. CMake 配置 引入头文件 :
#引入头文件
include_directories("include")
3. CMake 配置 静态库 : 用于引导如何链接动态库和静态库 , 这里配置自动根据当前是 32 位还是 64 位程序 , 确定静态库的配置目录 ;
#配置自动根据当前是 32 位还是 64 位程序 , 确定静态库的配置目录
if(CMAKE_CL_64)
set(platform x64)
else()
set(platform x86)
endif()
#配置静态库 , 用于引导如何链接动态库和静态库
link_directories("lib/${platform}")
4. CMake 配置链接库 : 链接生成的 005_Thread 和线程动态库 , 线程动态库是 lib/x64 下的 pthreadVC2.lib ;
#链接生成的 005_Thread 和线程动态库名字
# 动态库是 lib/x64 下的 pthreadVC2.lib
target_link_libraries(005_Thread pthreadVC2)
- 5. CMakeLists.txt 配置宏定义 : 在编译时会出现 " “timespec”:“struct” 类型重定义 " 报错信息 , 需要配置宏定义信息 ;
#处理 “timespec”:“struct” 类型重定义 报错信息
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_STRUCT_TIMESPEC")
6. 完整的 CMakeLists.txt 配置 :
# CMakeList.txt: 005_Thread 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)
#引入头文件
include_directories("include")
#配置自动根据当前是 32 位还是 64 位程序 , 确定静态库的配置目录
if(CMAKE_CL_64)
set(platform x64)
else()
set(platform x86)
endif()
#配置静态库 , 用于引导如何链接动态库和静态库
link_directories("lib/${platform}")
#处理 “timespec”:“struct” 类型重定义 报错信息
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_STRUCT_TIMESPEC")
# 将源代码添加到此项目的可执行文件。
add_executable (005_Thread "005_Thread.cpp" "005_Thread.h")
#链接生成的 005_Thread 和线程动态库名字
# 动态库是 lib/x64 下的 pthreadVC2.lib
target_link_libraries(005_Thread pthreadVC2)
# TODO: 如有需要,请添加测试并安装目标。
上面的内容是项目配置内容, 下面是 Windows 系统配置内容 ;
POSIX 线程配置 ( Windows 动态库拷贝 | 注意 32 位库拷贝到 SysWOW64 目录 | 64 位库拷贝到 System32 目录 )
拷贝 .dll 动态库到 Windows 系统中 , 如果 Windows 系统中没有对应的动态库 , 运行时会报错 ;
1. 64 位的 .dll 动态库 : 将 Pre-built.2\dll\x64 目录下的两个 64 位 .dll 动态库 ( pthreadGC2.dll 和 pthreadVC2.dll ) 拷贝到 C:\Windows\System32 目录中 ;
- ① Pre-built.2\dll\x64 下的 动态库 :
- ② 拷贝到 C:\Windows\System32后的动态库 :
2. 32 位的 .dll 动态库 : 将 Pre-built.2\dll\x86 目录下的 5 个 32 位 .dll 动态库 ( pthreadGC2.dll , pthreadGCE2.dll , pthreadVC2.dll , pthreadVCE2.dll , pthreadVSE2.dll ) 拷贝到 C:\Windows\SysWOW64 目录中 ;
- ① 32 位 .dll 动态库 :
- ② 拷贝 32 位 动态库 : 将 32 位动态库拷贝到 C:\Windows\SysWOW64 目录下 ;
配置代码测试
线程使用代码 :
// 005_Thread.cpp: 定义应用程序的入口点。
//
#include "005_Thread.h"
#include <pthread.h>
using namespace std;
int main()
{
cout << "Hello CMake。" << endl;
//测试 POSIX 线程方法
pthread_self();
return 0;
}
CMake 配置文件 :
# CMakeList.txt: 005_Thread 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)
#引入头文件
include_directories("include")
#配置自动根据当前是 32 位还是 64 位程序 , 确定静态库的配置目录
if(CMAKE_CL_64)
set(platform x64)
else()
set(platform x86)
endif()
#配置静态库 , 用于引导如何链接动态库和静态库
link_directories("lib/${platform}")
#处理 “timespec”:“struct” 类型重定义 报错信息
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHAVE_STRUCT_TIMESPEC")
# 将源代码添加到此项目的可执行文件。
add_executable (005_Thread "005_Thread.cpp" "005_Thread.h")
#链接生成的 005_Thread 和线程动态库名字
# 动态库是 lib/x64 下的 pthreadVC2.lib
target_link_libraries(005_Thread pthreadVC2)
# TODO: 如有需要,请添加测试并安装目标。
运行结果 :