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.
'CC = 'clang ++'' - Neden? –