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.
'CC = 'clang ++'' - Tại sao? –