在windows上使用openmp和mingw.找不到-lpthread

Using openmp on windows with mingw. Cannot find -lpthread

本文关键字:mingw 找不到 -lpthread openmp windows      更新时间:2023-10-16

我有一个使用OpenMP并在linux上工作的CMake项目。当我在我的windows机器上编译它时,它看起来像CMake在为mingw的gcc找到openmp标志时遇到了麻烦。

我决定尝试一个较小的测试用例,只编译main_openmp.c

#include <omp.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
    int id;
    #pragma omp parallel private(id)
        {
        id = omp_get_thread_num();
        printf("%d: Hello World!n", id);
        }
    return 0;
}

当我尝试编译

gcc -o OpenMPTest2 main_testomp.c -fopenmp

我得到

>>> gcc -o OpenMPTest2 main_testomp.c -fopenmp
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lpthread
collect2.exe: error: ld returned 1 exit status

我试图在网上找到解决方案,并尝试了-lgomp、-lpthreadgc2和-lpthreadvc2的变体,但没有任何改进。

我递归地搜索了我的C:MinGw目录中包含lpthread的任何文件名,得到了这个:

C:MinGWbinpthreadgc2.dll
C:MinGWbinpthreadgce2.dll
C:MinGWvarcachemingw-getpackagespthreads-w32-2.9.1-1-mingw32-dll.tar.lzma
C:MinGWvarlibmingw-getdatamingw32-pthreads-w32.xml

我不确定我是否丢失了一个标志,或者一个包,或者我做错了什么。下面是gcc -v

的输出
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=mingw32 --without-pic
 --enable-shared --enable-static --with-gnu-ld --enable-lto --enable-libssp --disable-multilib --ena
ble-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32
-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gm
p-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr= --with-sy
stem-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp --enable-threads --with-libiconv
-prefix=/mingw32 --with-libintl-prefix=/mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIM
E_T
Thread model: win32
gcc version 4.8.1 (GCC)

你知道怎么了吗?

我终于能够让事情工作了。

首先,使用mingw-get安装mingw32-pthreads-w32

这允许我在gcc中使用-fopenmp标志。

但是当使用CMake时,我必须包括以下行:

message(STATUS "Checking OpenMP")
find_package(OpenMP)
IF(OPENMP_FOUND)
    message("Found OpenMP! ^_^")
    # add flags for OpenMP
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS}")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
ELSE()
    message("Missed OpenMP! x_x")
ENDIF()

正常,但我也必须确保我有OpenMP_CXX_FLAGS在我的target_link_libraries命令

set(SOURCE_FILES 
    src/foo.cpp 
    src/bar.cpp
    src/baz.cpp)
add_library(<mylib> SHARED ${SOURCE_FILES})
target_link_libraries(<mylib> ${OpenMP_CXX_FLAGS})

在您的CMakeLists.txt文件中,您应该使用以下命令:

find_package(OpenMP REQUIRED)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")

如果你在配置cmake时得到一个错误,那么这意味着你没有必要的库,或者至少cmake找不到它们。如果您有库而cmake无法找到它们,那么请确保设置了查找路径:

set (CMAKE_FIND_ROOT_PATH C:/MinGW)

你可能想尝试创建一个"工具链"文件,如下所述。

我还建议您尝试mingw-w64交叉编译Windows。我成功地将它用于32位和64位应用程序。我用mingw[32/64]-cmake,然后一切都正常了。

我使用的是Fedora 19和20,与您的问题相关的一些软件包是(32位):

mingw32-filesystem
mingw32-libgomp

对我来说非常简单的步骤:

  • 进入MinGW安装管理器
  • 在左侧查找MinGW标准库部分
  • 安装mingw32-pthreads-w32