【问题标题】:How do I install pthread_win32 (Windows pthread / posix thread library) for Visual Studio 2005?如何为 Visual Studio 2005 安装 pthread_win32(Windows pthread / posix 线程库)?
【发布时间】:2011-08-04 23:23:00
【问题描述】:

为了清楚起见 - 我已经搜索了互联网的深度并返回有关如何执行此操作的信息

我正在寻求帮助来设置 pthread_Win32 以使用 Visual Studio 2005。我正在使用 C 进行编程,并且我有许多多线程分配要使用 pthread.h 编写。但是,由于 pthread 是 unix 原生的,所以我必须编写所有代码、ftp 它,然后通过 ssh 连接到我的班级的远程 unix 系统来运行它。它使开发需要更长的时间,而且效率非常低。我希望(最重要的是)能够在我的 win32 机器上运行它,这样我就可以在 Visual Studio 中进行开发,就像我已经做了很长一段时间一样。

我已将 pthread.lib 文件和 pthread.h 文件安装到所有其他文件所在的相应 lib/header 目录中。另一方面,DLL(实际库)我放在 c:\windows\system32 中。我尝试将 DLL 添加为依赖项(右键单击项目 -> 引用 -> 添加新引用),但正如其他人所说,我得到的只是一个空白对话框,没有添加任何 DLL 文件或任何东西的选项。好像能识别头文件,但是编译的时候出现这些错误:

1>正在链接...

1>main.obj:错误 LNK2019:未解析的外部符号 _imp_pthread_join 在函数 _main

中引用

1>main.obj:错误 LNK2019:未解析的外部符号 _imp_pthread_create 在函数 _main

中引用

1>main.obj:错误 LNK2019:未解析的外部符号 _imp_pthread_exit 在函数 _fcount 中引用

根据我的研究,我确定这是 DLL 的问题,并且我假设它无法找到我在代码中引用的函数的定义。我已经搜索了高低,我似乎无法找到解决这个问题的任何方法。我已将 lib/header 文件的目录添加到我的链接器中,以防万一,但这并没有解决问题。我需要在 Visual Studio 中做一些事情来指定我需要 pthreadVC2.dll 作为项目依赖项——目前这似乎是不可能的(而且非常令人沮丧)。

有什么智慧之言吗?

非常感谢

【问题讨论】:

  • 通常 __imp_thread_join 的东西意味着它认为它是 C++ 但它是 C...也许可以尝试在包含周围添加一个 extern C { } 块。

标签: c windows winapi visual-studio-2005 pthreads


【解决方案1】:

我最近遇到了这个问题。 如果 pthread.h 包含在动态链接模式中,似乎 __imp__ 前缀会添加到函数名称之前。 只需将 PTW32_STATIC_LIB 定义添加到您的项目或源代码中,然后添加 pthread.h 即可解决问题。

#define PTW32_STATIC_LIB
#include <pthread.h>

虽然,我还没有完全结束,因为 Visual Studio 现在尝试使用 _[FuncName] 而不是 [FuncName]

在 Visual Studio 中,无论是静态链接 (.lib) 还是动态链接 (.dll),函数的声明似乎都不同。

要定义一个函数,您将动态链接:

__declspec (dllimport) int myFunc(int myArgs) ;

要定义您为动态链接导出的函数:

__declspec (dllexport) int myFunc(int myArgs) ;

最简单的方法是定义一个静态链接的函数:

int myFunc(int myArgs) ;

[编辑]

我正在进行调查,并在 MS 帮助中心通过 this。 似乎为了避免 _[FuncName] 效果,需要通过以下方式定义静态链接库函数:

int __cdecl myFunc(int MyArgs) ;

【讨论】:

  • 很好的答案!可能节省了我几个小时。您在哪里找到记录在案的 PTW32_STATIC_LIB 定义?
  • 谢谢您,刚刚注意到您的评论。老实说,我不记得在哪里找到它了,可能当时正在研究 python 和系统头文件。
【解决方案2】:

您是否将pthreadVC.lib(或您需要的任何特定库)添加到项目属性中:

Linker/Input/Additional Dependencies

仅将 lib 文件放在特定目录中是不够的,需要告知链接器将其用作输入。

【讨论】:

  • 是的,lib 和头文件已被放置在 VC 启动时已查找这些文件的目录中。当我编码时,环境会识别 pthread 函数和变量类型。但是,在我链接之前我不会收到错误消息。我相信这些函数是在 pthreadVC2.dll 中定义的。 .lib 和 .h 文件位于正确的位置
  • @Sam:lib 文件可能在正确的位置,但仍需要告知项目包含该特定的 lib 文件。假设您正在使用 IDE 项目进行构建,请进入项目属性表并将pthread.lib 放入我在答案中描述的属性中。请注意,pthread.lib 可能是您想要的,但根据您项目的具体情况,您可能需要一个名称稍有不同的库(取决于您是否使用 C++ 等)。
  • @MichaelBurr。谢谢你。你的回答很有用。 +1
【解决方案3】:

仅将 pthreadVC2.lib 添加到链接器列表是不够的。 您还必须添加额外的库,例如 pthreadVCE2.lib 和 pthreadVSE2.lib。

我遇到了同样的问题,但后来我通过添加这些文件解决了这个问题。

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多