[英]How do you compile static pthread-win32 lib for x64?
看起来已经做了一些工作来使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 vcpkg git repo
从您克隆 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 是 Linux 等 POSIX 平台上的 C 系统库,因此只有这些组合才会在 Windows 上为您提供与在 Linux、FreeBSD 等上完全相同的 C 错误行为。
此消息可能会有所帮助。
要扩展 kgriffs 答案,必须再做两件事才能实际构建 64 位 DLL 而不是 32 位 DLL。
通过CVS首先下载最新的并行线程(如建议在这里)
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 Command Prompt 设置的环境变量(VS 2010 Express 加 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目标编译。 甚至静态链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.