2014-05-09 18 views
7

Tôi có một dự án CMake đang sử dụng OpenMP và hoạt động trên Linux. Khi tôi biên dịch nó trên máy tính của mình, có vẻ như CMake gặp khó khăn trong việc tìm kiếm cờ openmp cho gcc của mingw.Sử dụng openmp trên windows với mingw. Không thể tìm thấy --ppread

Tôi quyết định thử một trường hợp thử nghiệm nhỏ hơn và chỉ cần biên dịch 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; 
} 

Sau đó, khi tôi cố gắng biên dịch

gcc -o OpenMPTest2 main_testomp.c -fopenmp 

tôi nhận được

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

Tôi đã cố gắng tìm giải pháp trực tuyến và đã thử các biến thể của -lgomp, -lpthreadgc2 và -lpthreadvc2, không cải thiện.

Tôi đã tìm kiếm C của tôi: \ MinGW thư mục đệ quy cho bất kỳ tên tập tin chứa lpthread và nhận điều này:

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 

Tôi không chắc chắn nếu tôi thiếu một lá cờ, hay một gói, hoặc những gì tôi m làm sai. Để có biện pháp tốt ở đây là đầu ra của 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) 

Bất kỳ ý tưởng gì là sai?

Trả lời

18

cuối cùng tôi đã có thể có được những điều làm việc.

Thứ nhất, sử dụng mingw-get Tôi đã cài đặt mingw32-pthreads-w32

này cho phép tôi sử dụng cờ -fopenmp với gcc.

Nhưng khi sử dụng CMake tôi phải bao gồm các dòng:

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

như bình thường, nhưng tôi cũng phải chắc chắn rằng tôi đã là OpenMP_CXX_FLAGS trong target_link_libraries tôi lệnh

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

Trong file CMakeLists.txt của bạn, bạn nên sử dụng như sau:

find_package(OpenMP REQUIRED) 

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

Nếu bạn nhận được một thông báo lỗi khi bạn đang cấu hình cmake, sau đó có nghĩa là bạn không có các thư viện cần thiết, hoặc ít nhất là có thể cmake không tìm thấy chúng. Nếu bạn có các thư viện và cmake không thể tìm thấy họ, thì chắc chắn rằng con đường tìm được thiết lập:

set (CMAKE_FIND_ROOT_PATH C:/MinGW) 

Bạn có thể muốn thử tạo ra một "toolchain" tệp dưới dạng mô tả here.

Tôi cũng khuyên bạn nên thử mingw-w64 để biên dịch chéo cho Windows. Tôi sử dụng thành công cho cả ứng dụng 32 bit và 64 bit. Tôi sử dụng mingw [32/64] -cmake, và sau đó tất cả mọi thứ chỉ hoạt động.

Tôi đang sử dụng Fedora 19 và 20, và một số gói có liên quan đến câu hỏi của bạn là (32-bit):

mingw32-filesystem 
mingw32-libgomp 
+0

Tôi có dòng đó trong CMakeLists.txt của mình, tôi không chắc chắn lý do tại sao nó sẽ không tìm thấy gói mặc dù. Tôi sẽ cung cấp cho mingw-w64 một cái nhìn mặc dù. Tôi có C: \ MinGW \ bin \ libgomp-1.dll. Tôi không nhìn thấy bất cứ điều gì khi tôi tìm kiếm hệ thống tập tin trong C: \ MinGW, và tôi không thấy bất cứ điều gì giống như nó trong cửa sổ mingw-get hoặc. Làm cách nào để cài đặt? – Erotemic

+0

@Erotemic Tôi đã chỉnh sửa câu trả lời của tôi - điều đó có giúp ích gì không? – Patrick

+0

Tôi đã thử toolchain, và thiết lập cmake_find_root_path, cả hai ý tưởng đều thất bại. Đường dẫn nên sử dụng đường dẫn kiểu cửa sổ và không nên có dấu ngoặc kép phải không? – Erotemic

1

bước Rất đơn giản đã làm việc cho tôi:

  • Đã đến trình quản lý cài đặt MinGW
  • Tìm phần Thư viện Tiêu chuẩn MinGW ở bên trái
  • Cài đặt gói mingw32-pthreads-w32.
Các vấn đề liên quan