ゴール:私は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");
}
私はいくつかのディレクトリを含める交換する必要があるように思えるおよび/またはライブラリディレクトリ。どのようなオプションを変更する必要がありますか?
ありがとうございます。
'CC = 'clang ++'' - なぜですか? –