Использование openmp в windows с mingw. Не могу найти -lpthread

у меня есть проект CMake, который использует OpenMP и работает на linux. Когда я пошел, чтобы скомпилировать его на моей машине windows, казалось, что CMake испытывает проблемы с поиском флагов openmp для gcc mingw.

я решил попробовать меньший тестовый случай и просто скомпилировать 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)

есть идеи, что случилось?

3 ответов


Я, наконец, смог заставить вещи работать.

во-первых, с помощью mingw-get я установил mingw32-pthreads-w32

Это позволило мне использовать флаг-fopenmp с gcc.

но при использовании 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)

вы можете попробовать создать файл "toolchain", как описано здесь.

Я также предложил бы вам попробовать mingw-w64 для кросс-компиляции для Windows. Я успешно использую его как для 32-разрядных, так и для 64-разрядных приложений. Я использую mingw[32/64] - cmake, и тогда все просто работает.

Я использую Fedora 19 и 20, и некоторые пакеты, относящиеся к вашему вопросу (для 32-бит):

mingw32-filesystem
mingw32-libgomp

очень простые шаги, которые сработали для меня:

  • добрался до менеджера установки MinGW
  • найти раздел стандартных библиотек MinGW на левой стороне
  • установить mingw32-pthreads-w32 пакеты.