2011-02-07 5 views
7

मैं निम्नलिखित प्रपत्र के एक कार्यक्रम के दौरान लिखा है कैसे लिंक करें:मैटलैब का 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 के साथ पुन: संकलित करने के लिए कह रहे हैं?

मेरे पास लाइब्रेरी का स्रोत नहीं है, यदि पुस्तकालय को पुन: संकलित करने का सुझाव है तो क्या कोई कामकाज है?

"स्थानीय वस्तु के खिलाफ स्थानांतरण" का क्या अर्थ है?

मेरा निरंतर धन्यवाद।

उत्तर

5

-l, -L, या -I उन पर्यावरण चरों में तर्क डालने का प्रयास न करें। मैक्स फ़ंक्शन उन प्रकार के तर्कों को सीधे संभाल देगा। तो शायद कुछ ऐसा:

mex -v CC="gcc44" CFLAGS="\$CFLAGS -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp" -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial mex_cvode.c 
+1

मैंने आदेश की कोशिश की और एक अलग त्रुटि मिली (पता नहीं है कि यह प्रगति है या नहीं)। मैंने नई समस्या दिखाने के लिए सवाल संपादित किया। आपकी सहायता के लिए धन्यवाद. – Sevenless

+1

@ स्वेनलेस: क्षमा करें, अगर आपके पास स्रोत तक पहुंच नहीं है, तो मुझे नहीं पता कि यह नई त्रुटि कैसे हल की जा सकती है। यह गहरा जादू है कि मुझे पता है कि कैसे निपटना है, लेकिन इसका अर्थ यह है कि: साझा पुस्तकालयों (जैसे मैक्स फाइलों) को स्वतंत्र स्थिति की आवश्यकता होती है, क्योंकि उन्हें कुछ मनमानी स्थिति में लोड किया जाएगा। जिस स्थिर पुस्तकालय में आप लिंक करने का प्रयास कर रहे हैं वह स्थिति निर्भर है, इसलिए इसे किसी भी ओले स्मृति स्थान पर ठीक से लोड नहीं किया जा सकता है। इसे फिर से तैयार करने की जरूरत है। – kwatford

+1

इसलिए मैंने अपने सिस्टम व्यवस्थापक के साथ स्रोत का पीछा किया और हमने साझा विकल्पों के साथ हलकों को रीमेड किया। अब यह काम कर रहा है। मूल फिक्स दोनों के लिए धन्यवाद और पुस्तकालयों के साथ मुझे सही रास्ते पर लाने के लिए धन्यवाद। – Sevenless

0

मैटलैब अपने स्वयं के libstdc और libstdC++ का उपयोग करता है।

शॉर्टकट उन पुस्तकालयों को जीसीसी 44 पुस्तकालयों में प्रतीकात्मक करना होगा जिन्हें आप उपयोग करना चाहते हैं।

लेकिन यह जाने का वांछित तरीका नहीं हो सकता है। आप बाहरी मैटलैब प्रॉम्प्ट को संकलित करने का प्रयास कर सकते हैं और देख सकते हैं कि यह अभी भी संकलन में विफल रहता है या नहीं।

4

क्वाटफ़ोर्ड ने मुझे दूसरे प्रश्न के साथ सही रास्ते पर रखा। मैं साझा पुस्तकालयों के साथ सैंडियल सॉल्वर के पुनर्निर्माण द्वारा काम करने के लिए मैक्स कमांड प्राप्त करने में सक्षम था। विशेष रूप से, मैं के साथ बनाया गया:

% make distclean 
% ./configure --prefix=/home/matteson/sundials --enable-shared 
% make 
% make install 

इसके अलावा, धन्यवाद फोन करके मूल करने के लिए सुधार के लिए kwatford रहे हैं:

mex -v CC="gcc44" CFLAGS="\$CFLAGS -fopenmp" LDFLAGS="\$LDFLAGS -fopenmp" -I/home/matteson/sundials/include/ -L/home/matteson/sundials/lib -lsundials_cvode -lsundials_nvecserial mex_cvode.c 

के बाद से MEX जानता है कि कैसे एल और मैं संभाल करने के लिए।