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

时间:2008-10-01 19:28:41

标签: c++ c windows 64-bit pthreads

看起来已经做了一些工作来使pthread-win32与x64一起工作,但是没有构建指令。我尝试使用Visual Studio x64交叉工具命令提示符进行simly构建,但是当我尝试从x64应用程序链接到lib时,它无法看到任何函数导出。似乎它仍在将lib编译为x86或其他东西。

我甚至尝试将/ MACHINE添加到适当位置的makefile中,但它没有帮助。有没有人得到这个工作?

7 个答案:

答案 0 :(得分:3)

对我来说,我只使用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构建脚本)

答案 1 :(得分:2)

在它正式发布之前,看起来你必须查看CVS头才能获得该库的2.9版本。版本2.9包含所有x64补丁,但如果您尝试从命令行编译静态库,仍会遇到问题。

我所知道的唯一解决方法是使用DLL而不是静态链接LIB。

答案 2 :(得分:2)

这是我的表现(VS2015)。应该适用于较旧的Visual Studios。

1)从SourceForge下载发行版.zip 2)打开包装到干净的文件夹 - 应该看到" pthreads.2"
3)打开Visual Studio命令提示符,导航到" pthreads.2。" 4)运行" nmake",没有参数。它会生成一条帮助信息,列出您可以提供的所有法律命令。建立它。有关详细信息,请参阅" pthreads.2 \ FAQ"该文件解释了他们的3种不同风格的清理工作'处理

我建议建立" VC"和" VC-debug" (也许只是那些静态的)。真实的' pthreads是像Linux这样的POSIX平台上的C系统库,所以只有这些组合才能在Windows上为你提供与Linux,FreeBSD等完全相同的C错误行为。

答案 3 :(得分:2)

您可以使用 vcpkg here。这是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。使用导入库(DLL)构建动态库

构建x86 DLL

vcpkg install pthreads:x86-windows

将在。\ vcpkg \ installed \ x86-windows 中构建dll并导入库 在这里复制 lib include ,您就可以使用它们

构建x64 DLL

vcpkg install pthreads:x64-windows

将在。\ vcpkg \ installed \ x64-windows 中构建dll并导入库 在这里复制 lib include 文件夹。

2。构建静态库(LIB)

构建x86 LIB

vcpkg install pthreads:x86-windows-static 

将在。\ vcpkg \ installed \ x86-windows-static 中构建dll并导入库。 从这里复制 lib include ,您可以使用它们

构建x64 LIB

vcpkg install pthreads:x64-windows-static

将在。\ vcpkg \ installed \ x64-windows-static 中构建dll并导入库。 从此处复制 lib include 文件夹。

注意:尝试以管理员权限使用

答案 4 :(得分:0)

This message可能会有所帮助。

答案 5 :(得分:0)

扩展kgriffs回答一个人必须做两件事来实际构建64位DLL而不是32位DLL。

首先通过CVS下载最新的pthreads(如建议here

1)使用64位构建工具 - 通过在命令行中加载正确的VC环境设置(更多关于它here)来实现:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat amd64

(将11.0更改为您正在使用的任何版本)

2)因为它是在pthreads Makefile中写的:

  

TARGET_CPU是由Visual Studio命令提示符设置的环境变量   由SDK提供(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。

答案 6 :(得分:0)

我成功地将“ pthread-win32”替换为“ pthreads4w” https://sourceforge.net/projects/pthreads4w/,并使用控制台nmake命令在x64目标的MSVC2019中进行了编译。甚至是静态链接。