Berikut ini kita akan belajar bagaimana membuat sebuah fungsi matlab (.m) bisa dijalankan di compiler C dengan platform Windows. Dalam hal ini kita menggunakan platform Microsoft Visual Studio. Cara ini akan memudahkan bagi kita apabila sebuah fungsi sudah cukup advance di matlab, dan kita hanya perlu memanfaatkannya (dalam bentuk shared library) tanpa perlu mengconvert code tersebut seluruhnya ke dalam platform C/C++. Kali ini kita akan membuat contoh sederhana sebuah code matlab yang akan dicoba dimanfaatkan dalam platform C (dalam bentuk shared library) kemudian bisa menghasilkan file .exe.
1. Pertama kita membuat fungsi matlab. Sebagai contoh fungsi coffeebreak.m sebagai berikut :
2. Kemudian jalankan program coffeebreak.m diatas di platform matlab dengan sintax berikut ini. Ini bertujuan untuk membuat file 'shared library'.
maka pada folder/directory tempat kita menyimpan, akan ada tambahan beberapa file sebagai berikut :
4. Kalau belum memilki dependency walker, silahkan download di internet. Setelah file mylib.dll dibuka di software ini maka akan didapatkan fungsi-fungsi yang bisa kita gunakan sebagai fungsi code C kita. Dan berikut main.c yang bisa kita hasilkan :
6. Pada software Microsoft visual studio , klik pada bagian nama project, kemudian klik kanan. Pilih bagian properties. Pada bagian C/C++pilih bagian ‘general’ dan tambahkan ‘additional include directories’ dengan $MATLABROOT\extern\include\cpp;$MATLAB\extern\include
7. Pada bagian ‘preprocessor’ kita bisa tambahkan _MBCS, MSVC, MSWIND, IBMPC
8. Pada bagian ‘code generation’, pastikan untuk runtime library sudah tersetting : Multi-threaded Debug DLL (/MDd)
9. Pada bagian resource files, masukkan mylib.lib.
10. Pada folder computer kita, pastikan seluruh file pada poin 2 sudah berada satu directory dengan main.c.
11. Balik lagi ke software MVS, kita bisa compile project dengan cara ‘Build’ or ‘Rebuild’.
12. Setelah decompile, nanti pada bagian directory debug di computer kita bisa ditemukan file .exe.
13. Sebelum dijalankan, copy mylib.dll ke folder tempat .exe berada. Dan jalankan code exe-nya !!... maka hasilnya adalah sebagai berikut :
Silahkan mencoba ^_^
(fin / yan)
Referensi :
1. http://www.mathworks.com/support/solutions/en/data/1-18CBI/index.html?solution=1-18CBI
2. http://goffconcepts.com/techarticles/development/cpp/calldll.html
1. Pertama kita membuat fungsi matlab. Sebagai contoh fungsi coffeebreak.m sebagai berikut :
function coffeebreak % Load the topographical data for the globe load('topo.mat', 'topo', 'topomap1'); % Create a unit sphere with 50 facets. This sphere is the Earth. [x,y,z] = sphere(50); % Establish initial viewing and lighting parameters. Use Phong shading % and texture mapping to wrap the topo map data around the sphere. props.FaceColor= 'texture'; props.EdgeColor = 'none'; props.FaceLighting = 'phong'; props.CData = topo; % Set the viewpoint to look at the Atlantic Ocean. view(-130, 10); % Draw the sphere, with the topo data texture mapped to the surface. s=surface(x,y,z,props); set(gcf, 'Color', 'white'); % White background axis square axis off axis equal title('Coffee Break at Indonesian Chip Engineer.', 'FontSize', 14, 'FontWeight', 'Bold'); end referensi code : http://blogs.mathworks.com/loren/2010/11/18/deploying-standalone-applications/
2. Kemudian jalankan program coffeebreak.m diatas di platform matlab dengan sintax berikut ini. Ini bertujuan untuk membuat file 'shared library'.
mcc -t -L C -W lib:mylib -T link:lib -h coffeebreak.m libmmfile.mlib
maka pada folder/directory tempat kita menyimpan, akan ada tambahan beberapa file sebagai berikut :
- mccExcludedFiles (text document)3. Buka software Microsoft Visual Studio (MVS) dan membuat code C yang sesuai dengan mylib.dll yang sudah dihasilkan pada poin 2 diatas. Untuk membuat code C, kita membutuhkan software dependency walker untuk membaca fungsi-fungsi apa saja yang ada dalam mylib.dll.
- mylib.c
- mylib.dll
- mylib (export library file)
- mylib.exports
- mylib.h
- mylib (object file library)
- mylib.prj
- mylib_mcc_component_data.c
- readme.txt
4. Kalau belum memilki dependency walker, silahkan download di internet. Setelah file mylib.dll dibuka di software ini maka akan didapatkan fungsi-fungsi yang bisa kita gunakan sebagai fungsi code C kita. Dan berikut main.c yang bisa kita hasilkan :
#include5. Pada software Microsoft visual studio, bagian header files, silahkan ambil dari mylib.h yang sudah dihasilkan pada point 2.#include < windows> #include "mylib.h" int main () { mylibInitialize(); mlfCoffeeBreak(); mylibTerminate(); /* ketiga sintac diatas diambil dari hasil extraksi mylib.dll dengan menggunakan software dependency walker */ }
6. Pada software Microsoft visual studio , klik pada bagian nama project, kemudian klik kanan. Pilih bagian properties. Pada bagian C/C++pilih bagian ‘general’ dan tambahkan ‘additional include directories’ dengan $MATLABROOT\extern\include\cpp;$MATLAB\extern\include
7. Pada bagian ‘preprocessor’ kita bisa tambahkan _MBCS, MSVC, MSWIND, IBMPC
8. Pada bagian ‘code generation’, pastikan untuk runtime library sudah tersetting : Multi-threaded Debug DLL (/MDd)
9. Pada bagian resource files, masukkan mylib.lib.
10. Pada folder computer kita, pastikan seluruh file pada poin 2 sudah berada satu directory dengan main.c.
11. Balik lagi ke software MVS, kita bisa compile project dengan cara ‘Build’ or ‘Rebuild’.
12. Setelah decompile, nanti pada bagian directory debug di computer kita bisa ditemukan file .exe.
13. Sebelum dijalankan, copy mylib.dll ke folder tempat .exe berada. Dan jalankan code exe-nya !!... maka hasilnya adalah sebagai berikut :
Silahkan mencoba ^_^
(fin / yan)
Referensi :
1. http://www.mathworks.com/support/solutions/en/data/1-18CBI/index.html?solution=1-18CBI
2. http://goffconcepts.com/techarticles/development/cpp/calldll.html
Jika error karena compiler cl tidak ditemukan, jalankan langkah-langkah berikut ini:
ReplyDelete>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? n
Select a compiler:
[1] Lcc-win32 C 2.4.1
[2] Microsoft Visual C++ 6.0
[3] Microsoft Visual C++ .NET 2003
[4] Microsoft Visual C++ 2005 SP1
[5] Microsoft Visual C++ 2008 Express
[6] Microsoft Visual C++ 2008 SP1
[0] None
Compiler: 6
The default location for Microsoft Visual C++ 2008 SP1 compilers is C:\Program Files\Microsoft Visual Studio 9.0,
but that directory does not exist on this machine.
Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? n
Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] C:\Program Files\Microsoft Visual Studio 10.0\
Please verify your choices:
Compiler: Microsoft Visual C++ 2008 SP1
Location: C:\Program Files\Microsoft Visual Studio 10.0\
Are these correct [y]/n? y
****************************************************************************
Warning: Applications/components generated using Microsoft Visual Studio
2008 require that the Microsoft Visual Studio 2008 run-time
libraries be available on the computer used for deployment.
To redistribute your applications/components, be sure that the
deployment machine has these run-time libraries.
****************************************************************************
Trying to update options file: C:\Users\alfaruqi\AppData\Roaming\MathWorks\MATLAB\R2009a\compopts.bat
From template: C:\PROGRA~1\MATLAB\R2009a\bin\win32\mbuildopts\msvc90compp.bat
Done . . .
Tambahan:
ReplyDeleteUntuk memakai fungsi-fungsi mex pada visual studio (misal mxGetPr, dan lain-lain), dibutuhkan beberapa langkah tambahan:
1. Jangan lupa, include "mex.h" dan atau "matrix.h" sesuai kebutuhan.
2. Tambahkan #pragma comment(lib, "mclmcrrt.lib") pada main function.
3. Tambahkan include linker directories berikut:
C:\Program Files\MATLAB\MATLAB Compiler Runtime\v716\extern\lib\win32\microsoft
C:\Program Files\MATLAB\MATLAB Compiler Runtime\v716\extern\runtime\win32
WARNING:
v716 adalah versi Matlab Compiler Runtime yang saya pakai, versi ini harus sesuai dengan versi yang dipakai saat mengcompile .dll nya.
Referensi:
http://stackoverflow.com/questions/6499793/mx-create-double-matrix-error-when-integrating-matlab-with-vc
permisi mau tanya, kalau sebaliknya menjalankan algoritma C dengan compiler Matlab bagaimana ya?
ReplyDelete