2014-05-09 8 views
7

मेरे पास एक सीएमके परियोजना है जो ओपनएमपी का उपयोग कर रही है और लिनक्स पर काम करती है। जब मैं इसे अपनी विंडोज मशीन पर संकलित करने गया, तो ऐसा लगता था कि सीएमके को मिंगव के जीसीसी के लिए ओपनएमएम झंडे खोजने में परेशानी हो रही थी।mingw के साथ विंडोज़ पर openmp का उपयोग करना। नहीं मिल सकता -lpthread

मैं जब मैं

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 

मैं करने का प्रयास किया पाने की कोशिश एक छोटे परीक्षण का मामला 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; 
} 

फिर कोशिश करने के लिए और बस संकलन का फैसला किया समाधान को ऑनलाइन ढूंढें और बिना सुधार के -lgomp, -lpthreadgc2, और -lpthreadvc2 के रूपों का प्रयास किया।

मैं अपने सी की खोज: \ 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) 

कोई विचार क्या गलत है?

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 कर सकते हैं:

उत्तर

18

मैं अंत में काम कर बातें कर रहा था।

सबसे पहले, का उपयोग कर MinGW-मिल रहा mingw32-pthreads-W32

यह मैं जीसीसी के साथ -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}) 
1

अपने CMakeLists.txt फ़ाइल में, आपको निम्न का उपयोग करना चाहिए उन्हें नहीं मिला। आप पुस्तकालयों और cmake उन्हें नहीं मिल रहा है, तो यकीन है कि खोजने के पथ पर सेट है:

set (CMAKE_FIND_ROOT_PATH C:/MinGW) 

आप वर्णित here के रूप में एक "toolchain" फ़ाइल बनाने की कोशिश करना चाहते हो सकता है।

मैं यह भी सुझाव दूंगा कि आप विंडोज के लिए क्रॉस-कंपाइलिंग के लिए mingw-w64 आज़माएं। मैं इसे 32-बिट और 64-बिट अनुप्रयोगों दोनों के लिए सफलतापूर्वक उपयोग करता हूं। मैं mingw [32/64] -cmake का उपयोग करता हूं, और फिर सबकुछ बस काम करता है।

मैं फेडोरा 19 और 20, और अपने प्रश्न के लिए प्रासंगिक कुछ संकुल का उपयोग कर रहा (32-बिट के लिए) इस प्रकार हैं:

mingw32-filesystem 
mingw32-libgomp 
+0

मेरे पास मेरे CMakeLists.txt में वह पंक्ति है, मुझे यकीन नहीं है कि यह पैकेज क्यों नहीं मिलेगा। हालांकि मैं mingw-w64 एक लुक दूंगा। मेरे पास सी है: \ MinGW \ bin \ libgomp-1.dll। जब मैं C: \ MinGW में फाइल सिस्टम की खोज करता हूं, तो मुझे कुछ भी दिखाई नहीं देता है, और मुझे मिंगव-इन विंडो में ऐसा कुछ भी दिखाई नहीं देता है। मैं इसे कैसे स्थापित करूं? – Erotemic

+0

@ एरोटेमिक मैंने अपना जवाब संपादित किया - क्या इससे मदद मिलती है? – Patrick

+0

मैंने टूलचेन की कोशिश की, और cmake_find_root_path सेट करने, दोनों विचार विफल हुए। पथ विंडोज शैली पथ का उपयोग करना चाहिए और उद्धरण में सही नहीं होना चाहिए? – Erotemic

1

बहुत सरल कदम आदेश था करना था जो मेरे लिए काम करता है:

  • मिनजीडब्ल्यू स्थापना प्रबंधक
  • 012 पर मिला
  • बाएं तरफ
  • mingw32-pthreads-w32 पैकेज स्थापित करें पर मिनजीडब्ल्यू मानक पुस्तकालय अनुभाग खोजें।
संबंधित मुद्दे