2014-05-09 13 views
7

Mam projekt CMake, który używa OpenMP i działa na Linuksie. Kiedy poszedłem skompilować go na moim komputerze z systemem Windows wyglądało na to, że CMake miał problem ze znalezieniem flag openmp dla gcc mingw.Używanie openmp w oknach z mingw. Nie mogę znaleźć -lpthread

postanowiłem spróbować mniejszy przypadek testowy i po prostu skompilować 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; 
} 

Następnie przy próbie kompilacji

gcc -o OpenMPTest2 main_testomp.c -fopenmp 

uzyskać

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

próbowałem znaleźć rozwiązanie online i wypróbować warianty -lgomp, -lpthreadgc2 i -lpthreadvc2, bez żadnej poprawy.

Szukałem mojego katalogu C: \ MinGW rekurencyjnie za jakiekolwiek nazwach zawierających lpthread i dostał to:

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 

Nie jestem pewien, czy jestem brakuje flagę lub pakiet, albo co ja” M robię źle. Na dobrą sprawę tutaj jest wyjście 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) 

Każdy pomysł, co jest nie tak?

Odpowiedz

18

byłem w końcu w stanie uzyskać rzeczy pracy.

Po pierwsze, za pomocą MinGW-get zainstalowałem mingw32-pthreads-w32

To pozwoliło mi użyć -fopenmp flagę z gcc.

Jednak przy użyciu CMake musiałem obejmują linie:

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

jako normalne, ale miałem także upewnić się, miałem OpenMP_CXX_FLAGS w moich target_link_libraries dowodzić

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

W pliku CMakeLists.txt, należy użyć następujących:

find_package(OpenMP REQUIRED) 

set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") 
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 

Jeśli pojawi się błąd podczas konfiguracji cmake, to oznacza, że ​​nie mają one niezbędnych bibliotek, a przynajmniej może cmake nie znajduj ich. Jeśli masz biblioteki i cmake nie mogę ich znaleźć, a następnie upewnij się, że ścieżka znalezisko jest ustawiona:

set (CMAKE_FIND_ROOT_PATH C:/MinGW) 

Możecie spróbować tworząc „toolchain” plik opisanym here.

Proponuję również wypróbować mingw-w64 do kompilacji skrośnej dla systemu Windows. Używam go z powodzeniem zarówno w aplikacjach 32-bitowych, jak i 64-bitowych. Używam mingw [32/64] -cmake, a potem wszystko po prostu działa.

Używam Fedory 19 i 20, a niektóre pakiety odpowiednich do Twojego pytania są (32-bitowy):

mingw32-filesystem 
mingw32-libgomp 
+0

Mam tę linię w moim CMakeLists.txt, nie jestem pewien, dlaczego nie znalazłaby pakietów. Dam ci jednak mingw-w64. Mam C: \ MinGW \ bin \ libgomp-1.dll. Nie widzę niczego, gdy szukam systemu plików w C: \ MinGW, i nie widzę czegoś podobnego w oknie mingw-get. Jak mogę to zainstalować? – Erotemic

+0

@Erotemic Edytowałem swoją odpowiedź - czy to pomaga? – Patrick

+0

Wypróbowałem toolchain i ustawiłem cmake_find_root_path, obie koncepcje zawiodły. Ścieżka powinna używać ścieżek w stylu Windows i nie powinna być cytowana? – Erotemic

1

Bardzo proste kroki to zadziałało:

  • Dostałem się do menedżera instalacji MinGW
  • Znajdź sekcję bibliotek standardowych MinGW po lewej stronie:
  • Zainstaluj pakiety mingw32-pthreads-w32.