필터 지우기
필터 지우기

How to compile shrlibsample in R2012a

조회 수: 4 (최근 30일)
Steven
Steven 2013년 3월 11일
Folks,
I see good documentation on how to use the compiled example that ships with R2012a, but I don't see how to compile it, specifically the shrlibsample. Can someone point me to some documentation or answer how one should compile it? I'm asking this also because I can't seem to get structures to work the way they're supposed to, and doing things the "Matlab way" might make things work.
  댓글 수: 2
Konrad Malkowski
Konrad Malkowski 2013년 3월 12일
What operating system?
Steven
Steven 2013년 3월 13일
Redhat Enterprise 6. Linux.

댓글을 달려면 로그인하십시오.

답변 (1개)

Konrad Malkowski
Konrad Malkowski 2013년 3월 14일
You can compile the code in two ways: - using gcc - using mex (which uses gcc internally)
Here's how I compiled the code using gcc.
  1. Navigate to matlabroot/extern/examples/shrlib
  2. Compile the library
  3. % gcc -c shrlibsample.c -shared -I matlabroot/extern/include -fPIC -o shrlibsample.o
  4. % gcc -shared -Wl,-soname,libshrsample.so.1 -o libshrsample.so.1.0.1 shrlibsample.o
Now you will have a file names libshrsample.so.1.0.1 in the directory
Start MATLAB. Navigate to matlabroot/extern/examples/shrlib
hfile = fullfile(pwd,'shrlibsample.h')
>> loadlibrary('libshrsample.so.1.0.1',hfile)
Warning: The library name is not a valid name.
The library will be named "libshrsample0x2Eso0x2E10x2E0".
> In loadlibrary at 174
>> struct.p1 = 4; struct.p2 = 7.3; struct.p3 = -290
struct =
p1: 4
p2: 7.3000
p3: -290
>> [res, st] = calllib('libshrsample0x2Eso0x2E10x2E0', 'addStructByRef', struct)
res =
-279
st =
p1: 5.5000
p2: 1234
p3: 12345678
>>
(For more info on this example see the "calllib" help page).
You can also compile the code using mex.
>> cd ../extern/examples/shrlib/
>> hfile = fullfile(pwd,'shrlibsample.h')
hfile =
<matlabroot>/extern/examples/shrlib/shrlibsample.h
>> mex -v shrlibsample.c LDFLAGS="-shared -Wl"
**************************************************************************
Warning: Neither -compatibleArrayDims nor -largeArrayDims is selected.
Using -compatibleArrayDims. In the future, MATLAB will require
the use of -largeArrayDims and remove the -compatibleArrayDims
option. For more information, see:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html
**************************************************************************
-> mexopts.sh sourced from directory (DIR = $MATLAB/bin)
FILE = <matlabroot>/bin/mexopts.sh
----------------------------------------------------------------
-> MATLAB = <matlabroot>
-> CC = gcc
-> CC flags:
CFLAGS = -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread
CDEBUGFLAGS = -g
COPTIMFLAGS = -O -DNDEBUG
CLIBS = -Wl,-rpath-link,<matlabroot>/bin/glnxa64 -L<matlabroot>/glnxa64 -lmx -lmex -lmat -lm -lstdc++
arguments = -DMX_COMPAT_32
-> CXX = g++
-> CXX flags:
CXXFLAGS = -ansi -D_GNU_SOURCE -fPIC -fno-omit-frame-pointer -pthread
CXXDEBUGFLAGS = -g
CXXOPTIMFLAGS = -O -DNDEBUG
CXXLIBS = -Wl,-rpath-link,<matlabroot>/glnxa64 -L<matlabroot>/bin/glnxa64 -lmx -lmex -lmat -lm
arguments = -DMX_COMPAT_32
-> FC = gfortran
-> FC flags:
FFLAGS = -fexceptions -fbackslash -fPIC -fno-omit-frame-pointer
FDEBUGFLAGS = -g
FOPTIMFLAGS = -O
FLIBS = -Wl,-rpath-link,<matlabroot>/bin/glnxa64 -L<matlabroot>/bin/glnxa64 -lmx -lmex -lmat -lm
arguments = -DMX_COMPAT_32
-> LD = gcc
-> Link flags:
LDFLAGS = -shared -Wl
LDDEBUGFLAGS = -g
LDOPTIMFLAGS = -O
LDEXTENSION = .mexa64
arguments =
-> LDCXX =
-> Link flags:
LDCXXFLAGS =
LDCXXDEBUGFLAGS =
LDCXXOPTIMFLAGS =
LDCXXEXTENSION =
arguments =
----------------------------------------------------------------
-> gcc -c -I<matlabroot>/extern/include -I<matlabroot>/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -DMX_COMPAT_32 -O -DNDEBUG "shrlibsample.c"
-> gcc -O -shared -Wl -o "shrlibsample.mexa64" shrlibsample.o -Wl,-rpath-link,<matlabroot>/bin/glnxa64 -L<matlabroot>/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
>> loadlibrary('shrlibsample',hfile)
>> struct.p1 = 4; struct.p2 = 7.3; struct.p3 = -290
struct =
p1: 4
p2: 7.3000
p3: -290
>> [res, st] = calllib('shrlibsample', 'addStructByRef', struct)
res =
-279
st =
p1: 5.5000
p2: 1234
p3: 12345678
>>
>>
  댓글 수: 1
Philip Borghesani
Philip Borghesani 2013년 3월 14일
I like the shared library versioning in the first example but hate the generated name try:
loadlibrary('libshrsample.so.1.0.1',hfile,'alias','sample')
[res, st] = calllib('sample', 'addStructByRef', struct)

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Call C from MATLAB에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by