【问题标题】:Using openmp on windows with mingw. Cannot find -lpthread在带有 mingw 的 Windows 上使用 openmp。找不到 -lpthread
【发布时间】:2014-06-26 14:37:39
【问题描述】:

我有一个使用 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:\MinGW\bin\pthreadgc2.dll
C:\MinGW\bin\pthreadgce2.dll
C:\MinGW\var\cache\mingw-get\packages\pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma
C:\MinGW\var\lib\mingw-get\data\mingw32-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)

知道有什么问题吗?

【问题讨论】:

    标签: c++ windows gcc mingw openmp


    【解决方案1】:

    我终于能够让事情正常进行。

    首先,我使用 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()
    

    正常,但我还必须确保我的 target_link_libraries 命令中有 OpenMP_CXX_FLAGS

    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})
    

    【讨论】:

      【解决方案2】:

      在您的 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)
      

      您可能想尝试按照here 的描述创建“工具链”文件。

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

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

      mingw32-filesystem
      mingw32-libgomp
      

      【讨论】:

      • 我的 CMakeLists.txt 中确实有该行,但我不确定它为什么找不到包。不过,我会给 mingw-w64 看看。我有 C:\MinGW\bin\libgomp-1.dll。当我在 C:\MinGW 中搜索文件系统时,我什么也看不到,在 mingw-get 窗口中我也看不到任何类似的东西。我该如何安装它?
      • 我尝试了工具链,并设置了 cmake_find_root_path,两个想法都失败了。路径应该使用 windows 风格的路径,不应该用引号引起来吗?
      • @Erotemic cmake 在 Windows 上处理正斜杠,我认为您不需要引号来设置根路径(链接中的示例不使用引号)。你确实设置了CMAKE_FIND_ROOT_PATH 而不是cmake_find_root_path,对吧?变量名在 cmake 中区分大小写。
      • 是的,我在脚本中使用了 allcaps 变量。我还没有时间研究 mingw-w64,但是当我这样做时,我会告诉你这是怎么回事。
      【解决方案3】:

      对我有用的非常简单的步骤:

      • 转到 MinGW 安装管理器
      • 在左侧找到 MinGW 标准库部分
      • 安装 mingw32-pthreads-w32 软件包。

      【讨论】:

        猜你喜欢
        • 2017-01-04
        • 2020-07-30
        • 1970-01-01
        • 2020-05-18
        • 2011-10-14
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        相关资源
        最近更新 更多