2013-06-05 14 views
5

ゴール:私はMathWorks社のMATLAB MEXは、C++ 11のスレッド打ち鳴らす - >未定義シンボルエラー

のXcode 4.6を使用してMatlabのMEXファイルでC++ 11(R2013a)のスレッドSTLを使用したい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++ 11の機能を持たない通常のmexファイルはコンパイルされます。さらに、STLは、リンク障害を除いてコンパイラによって十分に検出されます。

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

実際のソースコードを以下に示します。 Matlab R2013 WINDOWSバージョンでVisual Studio 2012 Expressでコンパイルされているため、詳細は重要ではありません。同等のcppも "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

'CC = 'clang ++'' - なぜですか? –

答えて

5

エラーは、-stdlib=libc++に対してコンパイルしていますが、-lstdc++にリンクしています。

  1. mexopts.shのいずれかで修正できます。最も劇的で効果的なソリューションです。 ~/.matlab/${MATLAB_VERSION}/mexopts.shにあり、これはすべてのコンパイラオプションを決定します。単純にすべてのstdC++をC++に置き換えます。

  2. パッチワークの解決策:をCXXLIBSの末尾に追加してください。私は、標準ライブラリの複数のバージョンとのリンクがどのような効果があるのか​​よくわかりませんが、うまくいくようです。あなたのmex呼び出しでは、引数CXXLIBS="\$CXXLIBS -lc++"を追加してください。

第2の問題として、CXXFLAGSの値を完全に上書きしていると思います。上の図のように$のシンボルをエスケープする必要があります。

関連する問題