2013-06-05 30 views
5

Hedef: Benmatlab mex C++ 11 iplik tınlamak -> Tanımsız semboller hata

Xcode 4.6 kullanılarak Matlab mex dosyasında C++ 11 (R2013a) iplik STL kullanmak istiyorum ben modifiye ~/.matlab/R2013a C++ 11 özellikler olmadan/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 

Normal mex dosyaları iyice derlenmektedir. Ayrıca, STL, bağlantı başarısızlığı dışında derleyici tarafından iyi tespit edilir.

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

Asıl kaynak kodu aşağıda gösterilmiştir. Ayrıntılar önemli değil çünkü Visual Studio 2012 Express ile Matlab R2013 WINDOWS sürümünde iyi derleniyor. Eşdeğer bir cpp de "clang ++ -std = gnu ++ 11 -stdlib = libC++ clangtest.cpp" ile iyi bir şekilde derlenmiştir. Yani, en azından, bu kodları hiçbir mantıksal hatası (Hep güvenli kodları demiyorum. Sadece bir testtir.) Bulunmaktadır Bazı dizinleri dahil değiştirmek zorunda gibi

#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"); 
} 

görünüyor ve/veya kütüphane dizinleri. Ne tür seçenekler değiştirilmeli?

Teşekkür ederiz.

+2

'CC = 'clang ++'' - Neden? –

cevap

5

Hata, -stdlib=libc++ numaralı telefonlara karşı derleme ancak -lstdc++ numaralı telefon numaralarına bağlanmadan kaynaklanmaktadır. İki yoldan birini kullanarak çözebilirsiniz:

  1. Düzelt mexopts.sh içinde. En etkili ve etkili çözüm. ~/.matlab/${MATLAB_VERSION}/mexopts.sh'da bulunan, tüm derleyici seçeneklerini belirler. Tüm stdC++ değerini C++ olarak bul/değiştir.

  2. Patchwork çözümü: CXXLIBS'un kuyruk sonuna basitçe -lc++'u ekleyin. Standart kütüphanelerin çoklu versiyonlarına karşı bağlanmanın etkisinin ne olduğundan emin değilim, ama işe yarıyor gibi görünüyor. Mex'in çağrılmasında, CXXLIBS="\$CXXLIBS -lc++" argümanını ekleyin.

İkincil bir sorun olarak, CXXFLAGS değerini tamamen üzerine yazdığınızı düşünüyorum; Yukarıdaki kütüphaneler ile yaptığım gibi $ sembolünden kaçmalısınız.