2013-06-05 11 views
5

लक्ष्य: मैं सी मैटलैब MEX फ़ाइल में ++ 11 (R2013a) का धागा एसटीएल उपयोग करने के लिए Xcode 4,6matlab MEX बजना सी ++ 11 धागा -> अपरिभाषित प्रतीकों त्रुटि

का उपयोग कर चाहते हैं मैं संशोधित ~/.matlab/R2013a/mexopts.sh

 CC='clang++' # was llvm-gcc-4.2 
     CXX='clang++' # was llvm-g++-4.2 
     MACOSX_DEPLOYMENT_TARGET='10.8' # was 10.5. C++11 is supported >=10.7 
     CXXFLAGS="$CXXFLAGS -std=gnu++11 -stdlib=libc++" # additional flags 

सी ++ 11 सुविधाओं के बिना सामान्य मेक्स फ़ाइलों को अच्छी तरह से संकलित किया जाता है। इसके अलावा, लिंकिंग विफलता को छोड़कर कंपाइलर द्वारा एसटीएल अच्छी तरह से पता चला है।

>> mex mextest.cpp 

Undefined symbols for architecture x86_64: 
"std::__1::__thread_struct::__thread_struct()", referenced from:          
    void* std::__1::__thread_proxy<std::__1::tuple<void (*)()> >(void*) in mextest.o       
"std::__1::__thread_struct::~__thread_struct()", referenced from:        
    void* std::__1::__thread_proxy<std::__1::tuple<void (*)()> >(void*) in mextest.o       
"std::__1::__thread_local_data()", referenced from:        
    void* std::__1::__thread_proxy<std::__1::tuple<void (*)()> >(void*) in mextest.o      
"std::__1::__throw_system_error(int, char const*)", referenced from:      
    _mexFunction in mextest.o     
"std::__1::thread::join()", referenced from:      
    _mexFunction in mextest.o        
"std::__1::thread::~thread()", referenced from:      
    _mexFunction in mextest.o  
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

    mex: link of ' "mextest.mexmaci64"' failed. 

Error using mex (line 206) 
Unable to complete successfully. 

वास्तविक स्रोत कोड नीचे दिखाया गया है। विवरण महत्वपूर्ण नहीं हैं क्योंकि यह विजुअल स्टूडियो 2012 एक्सप्रेस के साथ मैटलैब आर2013 विन्डोज़ संस्करण में अच्छी तरह से संकलित है। एक समकक्ष सीपीपी भी "clang ++ -std = gnu ++ 11 -stdlib = libC++ clangtest.cpp" के साथ संकलित किया गया था। तो, कम से कम, वहाँ कोड में कोई तार्किक त्रुटि है (मैं यह नहीं कह रहा हूँ कि यह सुरक्षित कोड है। यह सिर्फ एक परीक्षण है।)

#include "mex.h" 
#include <thread> 
#include <stdio.h> 

int count_thread1 = 0; 
int count_thread2 = 0; 

void hello() 
{ 
    count_thread2 = 0; 
    for(int i=0; i<=10000; i++){ 
     for (int j=1;j<=20000;j++){ 
      count_thread2 = i-j-1; 
     } 
     count_thread2++; 
     printf("2: %d , %d\n", count_thread1, count_thread2); // Not sure if printf is thread-safe in Matlab. But it works in this particular example 
    } 
} 
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) 
{ 
    count_thread1 = 0; 
    std::thread t(hello); 
    for (int i=1;i<=10000;i++) 
    { 
     for (int j=1;j<=20000;j++){ 
      count_thread1 = -i+j-1; 
     } 
     count_thread1++; 
     mexPrintf("1: %d , %d\n", count_thread1, count_thread2); 
    } 
    mexPrintf("\n"); 
    t.join(); 
    mexPrintf("Done\n"); 
} 

ऐसा लगता है जैसे मैं बदलने के लिए कुछ निर्देशिका में शामिल है और/या लाइब्रेरी निर्देशिकाएं। किस तरह के विकल्पों को संशोधित किया जाना चाहिए?

धन्यवाद।

+2

'सीसी = 'क्लैंग ++'' - क्यों? –

उत्तर

5

त्रुटि -stdlib=libc++ के विरुद्ध संकलन के कारण है लेकिन -lstdc++ के विरुद्ध लिंकिंग है। mexopts.sh में

  1. यह फिक्स: आप दो तरीकों में से एक में इसे ठीक कर सकते हैं। सबसे कठोर और प्रभावी समाधान। ~/.matlab/${MATLAB_VERSION}/mexopts.sh में स्थित है, यह सभी संकलक विकल्पों को निर्धारित करता है। बस सभी stdC++ को C++ में ढूंढें/बदलें।

  2. पैचवर्क समाधान: CXXLIBS की पूंछ के अंत में -lc++ जोड़ें। मुझे यकीन नहीं है कि मानक पुस्तकालयों के कई संस्करणों के खिलाफ जोड़ने का क्या प्रभाव है, लेकिन ऐसा लगता है कि यह काम करता है। अपने मैक्स आमंत्रण में, CXXLIBS="\$CXXLIBS -lc++" तर्क जोड़ें।

द्वितीयक समस्या के रूप में, मेरा मानना ​​है कि आप CXXFLAGS के मूल्य को पूरी तरह ओवरराइट कर रहे हैं; आपको $ प्रतीक से बच जाना चाहिए जैसा मैंने पुस्तकालयों के साथ किया था।

संबंधित मुद्दे