I was wondering if there were any known issues with compiling using Matlab's mex compiler (which in turn uses and links with gcc) and using Boost.Statechart. When I implemented my statechart, I tested it using a separate main() file and it works 100%. When I compile using mex into a Matlab MEX file, I seem to lose the functionality of the event triggers. I've tried several things to figure out what is happening, but all I can ascertain is that if I use the iterators state_begin() and state_end() to access all internal states, the loop never executes. I tried to dereference state_begin(), but got a segfault. My initial approach was to use the state_downcast<>(), but this didn't work in SImulink either. My final suspicion was that it had something to do with the extern "C" business, but admittedly, I don't understand the effects of this statement other than how the symbol appears in the library (i.e. avoiding mangling). I get this same behavior on OS X 10.5 w/ gcc 4.0.1 as well as on Linux x86_64 with gcc 4.2.4.
If anyone wants to have my Simulink model to test, I could send that as well.
I've attached the following files:
ctrl_machine.[ch]pp - My state machine implementation/declaration.
main.cpp - My test program
air_controller.cpp - The C++ SFunction implementation used in Simulink.
mex uses the following compilation steps with gcc/g++
-> g++-4.2 -c -I/opt/matlab/extern/include -I/opt/matlab/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread -DMX_COMPAT_32 -O -DNDEBUG "ctrl_machine.cpp"
-> g++-4.2 -c -I/opt/matlab/extern/include -I/opt/matlab/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread -DMX_COMPAT_32 -O -DNDEBUG "air_controller.cpp"
-> gcc-4.2 -c -I/opt/matlab/extern/include -I/opt/matlab/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -DMX_COMPAT_32 -O -DNDEBUG "/opt/matlab/extern/src/mexversion.c"
-> g++-4.2 -O -pthread -shared -Wl,--version-script,/opt/matlab/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -o "ctrl_machine.mexa64" ctrl_machine.o air_controller.o mexversion.o -Wl,-rpath-link,/opt/matlab/bin/glnxa64 -L/opt/matlab/bin/glnxa64 -lmx -lmex -lmat -lm -lm
-----
Thanks,
Derek Ditch