繁体   English   中英

你如何为 x64 编译静态 pthread-win32 库?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM