c++ - 在带有 mingw 的 Windows 上使用 openmp。找不到 -lpthread

标签 c++ windows gcc mingw openmp

我有一个使用 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)

知道哪里出了问题吗?

最佳答案

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

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

关于c++ - 在带有 mingw 的 Windows 上使用 openmp。找不到 -lpthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554716/

相关文章:

c - 在 c 中制作调试打印宏时出错

c++ - 在 C++ std::<vector> 容器中存储多种类型结构的模式

c++ - 由于标识符未知,lldb 无法评估函数

c++ - 无法运行execv

c++ - 我需要更多空间吗?

python - 线程后的代码提前执行,为什么?

c# - 找不到方法 : 'Void System.Diagnostics.Tracing.FrameworkEventSource.BeginGetResponse(System.Object, System.String)'

linux - 如何在 Linux 中检查库是 Debug 还是 Release

windows - 如何根据文件大小比较复制文件?

gcc - 在 Ubuntu 11.04 中禁用堆栈崩溃保护