2013-06-05 66 views
5

Mục tiêu: Tôi muốn sử dụng thread STL của C++ 11 trong file mex Matlab (R2013a) sử dụng Xcode 4.6mex matlab Clang C++ 11 chủ đề -> ký tự Không xác định lỗi

tôi sửa đổi ~/.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 

Các tệp mex bình thường không có tính năng C++ 11 được biên dịch tốt. Hơn nữa, STL cũng được phát hiện bởi trình biên dịch ngoại trừ liên kết thất bại.

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

Mã nguồn thực tế được hiển thị bên dưới. Các chi tiết không quan trọng vì nó biên dịch tốt trong phiên bản Matlab R2013 WINDOWS với Visual Studio 2012 Express. Một cpp tương đương cũng được biên dịch tốt với "clang ++ -std = gnu ++ 11 -stdlib = libC++ clangtest.cpp". Vì vậy, ít nhất, không có lỗi logic trong các mã (Tôi không nói đó là mã an toàn. Nó chỉ là một thử nghiệm.)

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

Có vẻ như tôi phải thay thế một số thư mục bao gồm và/hoặc thư mục thư viện. Những loại tùy chọn nên được sửa đổi?

Cảm ơn bạn.

+2

'CC = 'clang ++'' - Tại sao? –

Trả lời

5

Lỗi này là do biên dịch với -stdlib=libc++ nhưng liên kết với -lstdc++. Bạn có thể sửa lỗi theo một trong hai cách:

  1. Khắc phục sự cố trong mexopts.sh. Giải pháp quyết liệt và hiệu quả nhất. Nằm trong ~/.matlab/${MATLAB_VERSION}/mexopts.sh, điều này xác định tất cả các tùy chọn trình biên dịch. Chỉ cần tìm/thay thế tất cả stdC++ thành C++.

  2. Giải pháp chắp vá: Chỉ cần thêm -lc++ vào cuối đuôi CXXLIBS. Tôi không chắc tác dụng của việc liên kết với nhiều phiên bản của các thư viện chuẩn là gì, nhưng có vẻ như nó hoạt động. Trong lời gọi mex của bạn, hãy thêm đối số CXXLIBS="\$CXXLIBS -lc++".

Là vấn đề thứ hai, tôi tin bạn hoàn toàn ghi đè giá trị CXXFLAGS; bạn phải thoát khỏi biểu tượng $ như tôi đã làm ở trên với các thư viện.

Các vấn đề liên quan