3

在尝试编译包含 pthread 的代码时,我遇到了如下所述的错误

warning: return type defaults to 'int' [-Wreturn-type]|
|In function 'print_message_function':|
warning: control reaches end of non-void function [-Wreturn-type]|
| undefined reference to `_imp__pthread_create'|
| undefined reference to `_imp__pthread_create'|
| undefined reference to `_imp__pthread_join'|
| undefined reference to `_imp__pthread_join'|

我在 Windows 7 上运行 GCC,但我安装了 mingw。我正在使用 IDE Code::Blocks 并选择“编译当前文件”。这是链接器设置的屏幕截图,我在这里不知所措

代码块链接器

更新:我添加-pthread到“其他链接器选项”中,效果更好。仍然存在问题。当我编译它说

|In function 'print_message_function':|
warning: control reaches end of non-void function [-Wreturn-type]|

当我去运行它时,CodeBlocks 说“它似乎还没有构建程序”,当我点击“构建”时,我看到了这个错误

mingw32-g++.exe  -o "SimpleExample.exe" "SimpleExample.o"  -static-libgcc -static-libstdc++ -pthread  
mingw32-g++.exe: error: unrecognized option '-pthread'
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 1 warnings (0 minutes, 0 seconds)

我该如何解决?我想在 Windows 上构建/测试,但让程序在 Unix 环境中运行。在 IDE 中编译和构建有什么区别?

4

4 回答 4

7

这个答案来晚了,但是……它对我有用,所以我决定分享它。

  1. 我从ftp://sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip下载了 pthreads 库
  2. 我解压缩它,然后我复制了
    C:\ProgramFiles\CodeBlocks\MinGW\include 中的头文件 (.h) 和 C:\ProgramFiles\CodeBlocks\MinGW\lib 中的库文件
  3. 我将 dll 文件复制到我的项目的可执行文件夹中(在我的情况下为 myprojects/bin/debug)

  4. 我在我的 Code::Blocks IDE 的 Settings -> Compiler -> Linker Settings -> Other Linker Options添加了 -lpthreadGC2 选项

希望这能有所帮助。

于 2014-12-13T22:07:53.587 回答
4

它是-lpthread,不是-pthread。

编辑:可以通过几种方式将库添加到编译行。如果我们有一个名为(例如)的文件,/usr/lib/libpthread.so我们可以像这样包含该文件:

cc -o myprog /usr/lib/libpthread.so myprog.c

或者,或者:

cc -o myprog -lpthread -L /usr/lib myprog.c

由于/usr/lib是标准目录,我们通常不需要该-L选项。在运行时我们可能需要设置一个环境变量:

export LD_LIBRARY_PATH=/usr/lib

但同样,标准库是默认的,因此除非您正在构建自己的库或使用第 3 方库,否则您不必使用它。

于 2013-10-09T09:25:16.710 回答
2
warning: control reaches end of non-void function [-Wreturn-type]|

您的main不返回值。return 0;在末尾添加main

| undefined reference to `_imp__pthread_create'|

您需要与线程库链接。添加-lpthread到链接器命令行。

于 2013-10-09T08:43:06.687 回答
2

以下是目前在安装了以下软件包的 Windows 下使用 MinGW 安装管理器(windows 的 mingw32 软件包管理器)时发生的情况:

  • mingw32-libpthreadgc-dll
  • mingw32-libpthreadgce-dll

错误:gcc 5.3.0 链接 pthread 失败,例如

c:/mingw/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: cannot find -lpthread
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second

解决方案:也包括来自 MinGW 包管理器的源,即也选择

  • mingw32-libpthreadgc-dev
  • mingw32-libpthreadgce-dev

MinGW 4.9.2 没有显示这种效果。Ubuntu 上的 GCC 5.4 也不需要 pthread 源来编译任何代码。这个帮助了我,而其他尝试(使用 mingw32-libpthread-old 或配置链接器设置)失败了。

于 2016-09-22T08:17:08.310 回答