मैं निम्नलिखित प्रपत्र के एक कार्यक्रम के दौरान लिखा है कैसे लिंक करें:मैटलैब का MEX संकलन
#include "stuff_I_need.h"
int main(){
construct_array(); // uses OpenMP pragma's
print_array();
return(0);
}
कि संकलित, लिंक, और निम्न आदेश के साथ सही ढंग से चलाता है:
`gcc44 -I/home/matteson/sundials/include/ main.c -lm -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial -fopenmp -o /home/matteson/MPI_test/CVODE_test/main_test`
"gcc44 "बस जीसीसी संस्करण 4.4 है और इसे इस तरह नामित किया गया है क्योंकि इसे क्लस्टर पर संकलित किया जा रहा है जो जीसीसी के कई संस्करणों को बनाए रखता है। पुस्तकालयों sundials_cvode और sundials_nvecserial सरणी के निर्माण के दौरान कई अंतर समीकरणों को हल करने में उपयोग किया जाता है।
अब जब मैं Matlab करने पर स्थानांतरण और फार्म की MEX फ़ाइल संकलन करने की कोशिश करना चाहते:
#include "stuff_I_need.h"
void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray* prhs[]){
construct_array(); // uses OpenMP pragma's
print_array();
}
और Matlab में निम्न आदेश के साथ संकलित करने के लिए प्रयास करें:
>> mex -v CC="gcc44" CFLAGS="\$CFLAGS -I/home/matteson/sundials/include/ -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial" mex_cvode.c
मैं निम्न संदेशों को एक लिंक त्रुटि में समापन प्राप्त करें:
-> mexopts.sh sourced from directory (DIR = $HOME/.matlab/$REL_VERSION)
FILE = /home/matteson/.matlab/R2010b/mexopts.sh
----------------------------------------------------------------
-> MATLAB = /misc/linux/64/opt/pkg/matlab/R2010b
-> CC = gcc44
-> CC flags:
CFLAGS = -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -L/home/matteson/sundials/lib -lsundials_nvecserial
CDEBUGFLAGS = -g
COPTIMFLAGS = -O -DNDEBUG
CLIBS = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/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,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm
arguments = -DMX_COMPAT_32
-> FC = g95
-> FC flags:
FFLAGS = -fexceptions -fPIC -fno-omit-frame-pointer
FDEBUGFLAGS = -g
FOPTIMFLAGS = -O
FLIBS = -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm
arguments = -DMX_COMPAT_32
-> LD = gcc44
-> Link flags:
LDFLAGS = -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmpofopenmp
LDDEBUGFLAGS = -g
LDOPTIMFLAGS = -O
LDEXTENSION = .mexa64
arguments =
-> LDCXX =
-> Link flags:
LDCXXFLAGS =
LDCXXDEBUGFLAGS =
LDCXXOPTIMFLAGS =
LDCXXEXTENSION =
arguments =
----------------------------------------------------------------
Warning: You are using gcc version "4.4.4". The version
currently supported with MEX is "4.3.4".
For a list of currently supported compilers see:
http://www.mathworks.com/support/compilers/current_release/
-> gcc44 -c -I/misc/linux/64/opt/pkg/matlab/R2010b/extern/include -I/misc/linux/64/opt/pkg/matlab/R2010b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -L/home/matteson/sundials/lib -lsundials_nvecserial -DMX_COMPAT_32 -O -DNDEBUG "mex_cvode.c"
-> gcc44 -O -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmpofopenmp -o "mex_cvode.mexa64" mex_cvode.o -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
mex_cvode.o: In function `mexFunction':
mex_cvode.c:(.text+0x2b2): undefined reference to `N_VNew_Serial'
mex_cvode.c:(.text+0x2db): undefined reference to `N_VNew_Serial'
mex_cvode.c:(.text+0x35b): undefined reference to `CVodeCreate'
mex_cvode.c:(.text+0x39c): undefined reference to `CVodeInit'
mex_cvode.c:(.text+0x3dd): undefined reference to `CVodeSVtolerances'
mex_cvode.c:(.text+0x412): undefined reference to `CVodeSetUserData'
mex_cvode.c:(.text+0x449): undefined reference to `CVDense'
mex_cvode.c:(.text+0x482): undefined reference to `CVDlsSetDenseJacFn'
mex_cvode.c:(.text+0x50c): undefined reference to `CVode'
mex_cvode.c:(.text+0x5b4): undefined reference to `N_VDestroy_Serial'
mex_cvode.c:(.text+0x5c0): undefined reference to `N_VDestroy_Serial'
mex_cvode.c:(.text+0x5cc): undefined reference to `CVodeFree'
collect2: ld returned 1 exit status
mex: link of ' "mex_cvode.mexa64"' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
किसी भी तरह, मैं correc नहीं दे रहा हूँ उचित रूप से लिंक करने के लिए टी झंडे। जैसे ही मैं gcc44 कमांड में लिंक करने के लिए कमांड को हटा देता हूं, तो मुझे त्रुटियों का एक ही सेट मिलता है (और कुछ और), मुझे पूरा यकीन है कि मुझे पुस्तकालयों को "देखने" के लिए कंपाइलर नहीं मिल रहा है।
मेरे प्रश्न हैं:
- तो त्रुटि के अपने विश्लेषण सही है, क्या झंडे मैं MEX संकलन आदेश को पारित करने के लिए सफलतापूर्वक लिंक करने के लिए की जरूरत है?
- वैकल्पिक रूप से, एक .mex64 निष्पादन योग्य संकलित करने के लिए मैटलैब पर्यावरण के बाहर संकलन और लिंक करने के लिए जीसीसी झंडे क्या हैं?
- यदि मेरा विश्लेषण गलत है, तो यहां से कहाँ जाना है?
मुझे लगता है कि मैं की संभावना से इनकार किया है असमर्थित संकलक चेतावनी के बाद से मैं जीसीसी 4.4 का उपयोग कर OpenMP कार्यक्रमों के साथ सरल MEX संकलन कर लिया है, लेकिन इन गणित पुस्तकालय के अलावा कुछ के खिलाफ लिंक करने के लिए नहीं था। साथ ही, यदि मैं "gfenmp" झंडे के साथ या उसके बिना संस्करण gcc संस्करण 4.1.2 या 4.3.4 के साथ संकलित करता हूं तो मुझे एक ही त्रुटि मिलती है।
अंत में मुझे कुछ संस्करणों में दिखाई देने वाले कुछ ओपनएमपी समर्थन की वजह से संस्करण 4.4 की आवश्यकता है।
सहायता के लिए अग्रिम धन्यवाद।
--Andrew
संपादन: (@KWATFORD)
तो मैं उद्धरण के बाहर बयान के साथ आदेश की कोशिश की, और त्रुटि मिली:
-> gcc44 -c -I/home/matteson/sundials/include/ -I/misc/linux/64/opt/pkg/matlab/R2010b/extern/include -I/misc/linux/64/opt/pkg/matlab/R2010b/simulink/include -DMATLAB_MEX_FILE -ansi -D_GNU_SOURCE -fexceptions -fPIC -fno-omit-frame-pointer -pthread -fopenmp -DMX_COMPAT_32 -O -DNDEBUG "mex_cvode.c"
-> gcc44 -O -pthread -shared -Wl,--version-script,/misc/linux/64/opt/pkg/matlab/R2010b/extern/lib/glnxa64/mexFunction.map -Wl,--no-undefined -fopenmp -o "mex_cvode.mexa64" mex_cvode.o -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial -Wl,-rpath-link,/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -L/misc/linux/64/opt/pkg/matlab/R2010b/bin/glnxa64 -lmx -lmex -lmat -lm -lstdc++
/usr/bin/ld: /home/matteson/sundials/lib/libsundials_cvode.a(cvode.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/home/matteson/sundials/lib/libsundials_cvode.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
mex: link of ' "mex_cvode.mexa64"' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
मैं एक हूँ "-एफपीआईसी" के साथ पुन: संकलित करने के सुझाव के बारे में थोड़ा उलझन में है क्योंकि जब मैं gcc44 कमांड को देखता हूं तो मैं -पीपीआईसी को एक विकल्प के रूप में देखता हूं।
क्या वे पुस्तकालय को -fPIC के साथ पुन: संकलित करने के लिए कह रहे हैं?
मेरे पास लाइब्रेरी का स्रोत नहीं है, यदि पुस्तकालय को पुन: संकलित करने का सुझाव है तो क्या कोई कामकाज है?
"स्थानीय वस्तु के खिलाफ स्थानांतरण" का क्या अर्थ है?
मेरा निरंतर धन्यवाद।
मैंने आदेश की कोशिश की और एक अलग त्रुटि मिली (पता नहीं है कि यह प्रगति है या नहीं)। मैंने नई समस्या दिखाने के लिए सवाल संपादित किया। आपकी सहायता के लिए धन्यवाद. – Sevenless
@ स्वेनलेस: क्षमा करें, अगर आपके पास स्रोत तक पहुंच नहीं है, तो मुझे नहीं पता कि यह नई त्रुटि कैसे हल की जा सकती है। यह गहरा जादू है कि मुझे पता है कि कैसे निपटना है, लेकिन इसका अर्थ यह है कि: साझा पुस्तकालयों (जैसे मैक्स फाइलों) को स्वतंत्र स्थिति की आवश्यकता होती है, क्योंकि उन्हें कुछ मनमानी स्थिति में लोड किया जाएगा। जिस स्थिर पुस्तकालय में आप लिंक करने का प्रयास कर रहे हैं वह स्थिति निर्भर है, इसलिए इसे किसी भी ओले स्मृति स्थान पर ठीक से लोड नहीं किया जा सकता है। इसे फिर से तैयार करने की जरूरत है। – kwatford
इसलिए मैंने अपने सिस्टम व्यवस्थापक के साथ स्रोत का पीछा किया और हमने साझा विकल्पों के साथ हलकों को रीमेड किया। अब यह काम कर रहा है। मूल फिक्स दोनों के लिए धन्यवाद और पुस्तकालयों के साथ मुझे सही रास्ते पर लाने के लिए धन्यवाद। – Sevenless