看起来已经做了一些工作来使pthread-win32与 x64 一起工作,但没有构建说明。我尝试使用 Visual Studio x64 交叉工具命令提示符进行简单构建,但是当我尝试从 x64 应用程序链接到 lib 时,它看不到任何函数导出。似乎它仍在将 lib 编译为 x86 或其他东西。
我什至尝试在适当的地方将 /MACHINE 添加到 makefile 中,但这没有帮助。有没有人让这个工作?
对我来说,我只使用 64 位 windows 编译器(在这种特殊情况下为 mingw-w64 交叉编译器)然后 make (with2.9.1) 像:
$ make clean GC-static
然后我如何安装它以供使用(当然,其中一些可能不需要),
cp libpthreadGC2.a $mingw_w64_x86_64_prefix/lib/libpthread.a
cp pthread.h sched.h semaphore.h $mingw_w64_x86_64_prefix/include
然后要使用它,您必须定义它(例如 ffmpeg 配置行以使用它):
--extra-cflags=-DPTW32_STATIC_LIB
无论如何,这是一种方式。
另一种方法是执行相同操作,然后修改 *.h 文件并从标头中删除对 dllexport 的所有引用(或在标头中手动定义 DPTW32_STATIC_LIB)。
前任:
sed 's/ __declspec (dllexport)//g;s/ __declspec (dllimport)//g'
(参考:zeranoe 构建脚本)
您可以在此处使用vcpkg 。这是 C++ 的 Windows 包管理器。它支持 pthread 构建以及其他开源库。
我想使用静态 pthread 库。当我下载 pthread 时,我得到了 dll(pthread.dll) 并导入了 lib(pthread.lib),即我不能只使用 pthread.lib,我必须使用 pthread.dll 文件。
所以使用 vcpkg 我已经构建了静态库。我可以在没有任何 dll 依赖项的情况下使用它
使用“vcpkg”,您可以构建静态库和动态库
您可以使用以下步骤
下面我添加了所有 DLL (x86|x64) 和 LIB (x86|x64) 案例的步骤。您可以根据需要构建它。
从 git 目录vcpkg git repo克隆 vcpkg
从您克隆 vcpkg 的目录运行以下命令 - 这将安装 vcpkg
bootstrap - vcpkg.bat
通过运行以下命令检查库的可用性
vcpkg search pthread
这将在下面显示结果
mbedtls[pthreads] Multi-threading support
pthread 3.0.0 empty package, linking to other port
pthreads 3.0.0-6 pthreads for windows
如您所见,它支持 Windows 的 pthread
1 .Building Dynamic Library with import lib (DLL)
构建 x86 DLL
vcpkg install pthreads:x86-windows
它将在.\vcpkg\installed\x86-windows中构建 dll 和导入库,从这里复制lib并包含,您可以使用它们
构建 x64 DLL
vcpkg install pthreads:x64-windows
它将在.\vcpkg\installed\x64-windows中构建 dll 和导入库,从这里复制lib和包含文件夹。
2.构建静态库(LIB)
构建 x86 LIB
vcpkg install pthreads:x86-windows-static
它将在.\vcpkg\installed\x86-windows-static中构建 dll 并导入库, 从此处复制lib并包含,您可以使用它们
构建 x64 LIB
vcpkg install pthreads:x64-windows-static
它将在.\vcpkg\installed\x64-windows-static中构建 dll 并导入库, 从此处复制lib和包含文件夹。
注意: 尝试使用管理员权限
在正式发布之前,您似乎必须查看 CVS 头才能获得该库的 2.9 版。2.9 版包含所有 x64 补丁,但如果您尝试从命令行编译静态库,仍然会遇到问题。
我知道的唯一解决方法是使用 DLL 而不是静态链接 LIB。
这是我的做法(VS2015)。也应该适用于较旧的 Visual Studio。
1) 从 SourceForge 下载发行版 .zip
2) 解压到一个干净的文件夹 - 应该看到“pthreads.2”
3) 打开 Visual Studio 命令提示符,导航到“pthreads.2”。4)运行“nmake”,没有参数。它会生成一条帮助消息,列出您可以使用“nmake”来构建它的所有合法命令。有关更多信息,请参阅“pthreads.2\FAQ”文件,该文件解释了它们的 3 种不同风格的“清理”处理。
我建议只构建“VC”和“VC-debug”(也许是静态的)。“真正的”pthreads 是 POSIX 平台(如 Linux)上的 C 系统库,因此只有这些组合才能在 Windows 上为您提供与在 Linux、FreeBSD 等平台上完全相同的 C 错误行为。
此消息可能会有所帮助。
要扩展 kgriffs 答案,必须再做两件事才能实际构建 64 位 DLL 而不是 32 位 DLL。
首先通过 CVS 下载最新的 pthreads(建议在这里)
1) 使用 64 位构建工具 - 通过在命令行中加载正确的 VC 环境设置来实现(更多信息在这里):
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat amd64
(将 11.0 更改为您使用的任何版本)
2)因为它写在pthreads Makefile中:
TARGET_CPU 是由 SDK 提供的 Visual Studio 命令提示符设置的环境变量(VS 2010 Express plus SDK 7.1) PLATFORM 是可以在 VS 2013 Express x64 交叉开发环境中设置的环境变量
这意味着,如果不是由 vcvars 完成(在我的情况下不是),您需要设置 TARGET_CPU 或 PLATFORM(以防我同时设置它们):
set TARGET_CPU=x64
set PLATFORM=x64
3)现在是最后一步:
nmake clean VC
nmake clean VC-debug
这将生成一个 64 位的 DLL 文件(以及正确的导入库和 PDB)。我可以验证它是否适用于 Visual Studio 2012。
我成功地将“pthread-win32”替换为“pthreads4w” https://sourceforge.net/projects/pthreads4w/nmake
,并使用控制台命令在 MSVC2019 中为 x64 目标编译。甚至静态链接。