【问题标题】:How do you compile static pthread-win32 lib for x64?你如何为 x64 编译静态 pthread-win32 库?
【发布时间】:2010-09-14 15:07:08
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案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 和导入库 这里复制 libinclude 就可以使用了

      构建 x64 DLL

      vcpkg install pthreads:x64-windows
      

      这将在 .\vcpkg\installed\x64-windows 中构建 dll 和导入库 在此处复制 libinclude 文件夹。

      2。构建静态库 (LIB)

      构建 x86 LIB

      vcpkg install pthreads:x86-windows-static 
      

      这将在 .\vcpkg\installed\x86-windows-static 中构建 dll 和导入库 从这里复制 libinclude 你可以使用它们

      构建 x64 LIB

      vcpkg install pthreads:x64-windows-static
      

      这将在 .\vcpkg\installed\x64-windows-static 中构建 dll 和导入库 从这里复制 libinclude 文件夹。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          这就是我的做法(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 错误行为。

          【讨论】:

          • 嘿,我认为这是最好的答案,但它并没有解决原始问题的一个方面。也就是说,如何更改 nmake Makefile 以使二进制文件成为 x64 位二进制文​​件而不是 x86 32 位二进制文​​件。如果有人知道,请添加到这个帖子。在 Makefile 中更改“VC-static-debug”支持的 nmake 构建配置非常容易,以生成发布静态库,例如“VC-static”。
          • 执行此操作的方法不是更改 nmake Makefile 的内容,而是使用 Visual Studio 工具链 env 在正确的 cmd shell 设置中触发 nmake 脚本,例如“用于 VS 2017 的 x64 本机工具命令提示符”cmd 快捷方式。这些 cmd 快捷方式随 Visual Studio 一起安装。
          【解决方案5】:

          This message 可能会有所帮助。

          【讨论】:

            【解决方案6】:

            要扩展 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 cross 中设置 开发环境

            这意味着,如果不是由 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。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 2010-09-14
                • 1970-01-01
                • 2011-07-05
                • 1970-01-01
                • 2015-12-01
                • 2011-02-10
                • 2015-03-06
                • 1970-01-01
                相关资源
                最近更新 更多