VS2017配置使用pthread.h

POSIX線程(POSIX threads),簡稱Pthreads,是線程的POSIX標準。該標準定義了創建和操縱線程的一整套API。在類Unix操作系統(Unix、Linux、Mac OS X等)中,都使用Pthreads作爲操作系統的線程。Windows操作系統也有其移植版pthreads-win32。

下載源碼

源碼主頁:https://sourceware.org/pthreads-win32/
ftp地址:ftp://sourceware.org/pub/pthreads-win32

上面的ftp地址不知何故無法連接,另外找了個資源:
https://www.mirrorservice.org/sites/sourceware.org/pub/pthreads-win32/

下載最新版本pthreads-w32-2-9-1-release.zip解壓得到三個文件夾

pthreads.2

pthreads.2 裏面包含了pthreads 的源代碼;

Pre-built.2

Pre-build.2 裏面包含了pthreads for win32 的頭文件和已編譯好的庫文件;

QueueUserAPCEx

QueueUserAPCEx 裏面是一個alert的driver,編譯需要DDK 。Windows Device Driver Kit (NTDDK.h) 需要額外單獨安裝。

若無特殊需求,直接引用Pre-built.2裏面的文件即可。

使用方法

Pre-built.2下有三個文件夾
dll 動態鏈接庫
include頭文件
lib 靜態鏈接庫

這裏提供兩種使用方式,一種是把頭文件和靜態庫放到IDE的安裝目錄,動態庫放到系統目錄,這樣VS的工程無需其他配置就可以直接使用pthread相關API,雖然取巧但省事;另一種的是對VS工程單獨引用,開發日常操作了。

VS2017與VS2019同理,已測試通過。

選擇一、全局引用

配置頭文件

把include文件夾下的頭文件拷貝到vs2017安裝目錄下

D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\

配置靜態鏈接庫

把lib文件夾下的靜態庫文件拷貝到vs2017安裝目錄下

D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\lib

配置動態鏈接庫

Pre-built.2\dll\x86下的文件拷貝到C:\Windows\SysWOW64目錄下
Pre-built.2\dll\x64下的文件拷貝到C:\Windows\System32目錄下


選擇二、項目引用

我在解決方案目錄新建了個ThirdPartyLib目錄,與項目目錄同級,並把Pre-built.2下的三個文件夾拷過來。

右鍵項目 - 屬性 - 配置屬性 - C/C++ - 添加附加包含目錄

…\ThirdPartyLib\include;
附加包含目錄

右鍵項目 - 屬性 - 配置屬性 - 鏈接器 - 添加32位平臺的附加庫目錄

…\ThirdPartyLib\lib\x86;在這裏插入圖片描述

右鍵項目 - 屬性 - 配置屬性 - 鏈接器 - 添加64位平臺的附加庫目錄

…\ThirdPartyLib\lib\x64;
在這裏插入圖片描述

右鍵項目 - 屬性 - 配置屬性 - 調試 - 環境 - 配置32位平臺環境

path=%path%;…/ThirdPartyLib/dll/x86;
在這裏插入圖片描述

右鍵項目 - 屬性 - 配置屬性 - 調試 - 環境 - 配置64位平臺環境

path=%path%;…/ThirdPartyLib/dll/x64;
在這裏插入圖片描述

測試

#include <pthread.h>
#include <stdio.h>
#include <windows.h>

#pragma comment(lib,"pthreadVC2.lib")

void* thread(void* val)
{
	int value = *((int*)val);
	printf("value: %d \n", value);
	while(value-- > 0)
	{
		printf(" %d \n", value);
	}
	return NULL;
}

int main()
{
	pthread_t tid;
	int value = 100;
	pthread_create(&tid, 0, thread, &value);

	system("pause");
	return 0;
}

編譯錯誤C2011 “timespec”:“struct”類型重定義

可修改pthread.h文件,在
#if !defined( PTHREAD_H )
#define PTHREAD_H
下面加上一行宏定義
#define HAVE_STRUCT_TIMESPEC
可以解決“timespec”:“struct”類型重定義錯誤

至此,已經可以在VS2017中使用。如果不想改動到VS2017的目錄和系統目錄,可以通過配置工程項目屬性,設置附加包含目錄/鏈接器附加依賴庫等選項,從而達到使用pthread庫的目的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章