Problema:
non capisco perché quando compilo (gcc -O2 -shared -o libunlink.so spm_unlink2.c) la funzione che ti ho allegato il compilatore mi ritorna questi errori:
C:\DOCUME~1\User\IMPOST~1\Temp\cc6Aa6EI.o:spm_unlink2.c:(.text+0x31): undefined
reference to `mxIsNumeric'
C:\DOCUME~1\User\IMPOST~1\Temp\cc6Aa6EI.o:spm_unlink2.c:(.text+0x40): undefined
reference to `mxGetN'
C:\DOCUME~1\User\IMPOST~1\Temp\cc6Aa6EI.o:spm_unlink2.c:(.text+0x58): undefined
reference to `mxCalloc'
C:\DOCUME~1\User\IMPOST~1\Temp\cc6Aa6EI.o:spm_unlink2.c:(.text+0x70): undefined
reference to `mxGetString'
C:\DOCUME~1\User\IMPOST~1\Temp\cc6Aa6EI.o:spm_unlink2.c:(.text+0x9e): undefined
reference to `mxFree'
C:\DOCUME~1\User\IMPOST~1\Temp\cc6Aa6EI.o:spm_unlink2.c:(.text+0xbc): undefined
reference to `mexErrMsgTxt'
C:\DOCUME~1\User\IMPOST~1\Temp\cc6Aa6EI.o:spm_unlink2.c:(.text+0xd1): undefined
reference to `mexErrMsgTxt'
collect2: ld returned 1 exit status
Se compilo con l'opzioni "-c" me lo compila però non mi fa il link a scilab: so1 = link('libunlink.so', 'myunlink', 'c');
restituendomi:
link: Il seg. archivio condiviso non era caricato: non è un'applicazione di Win32 valida.
Traduzione Matlab-Scilab
-
fabrileroy
10 3 - New entry

- Messaggi: 54
- Iscritto il: 1 feb 2011, 13:22
0
voti
[42] Re: Traduzione Matlab-Scilab
Per capire l'errore basta leggerlo:
manca un riferimento esterno a un file oggetto o una libreria con quel simbolo instanziato. Quella funzione si trova nella libreria "libmex.so", infatti nei sorgenti includi il file "mex.h".
Un possibile comando per compilarlo sotto Linux è il seguente:
l'opzione "-I" specifica il percorso dei file include, l'opzione "-L" specifica il percorso delle librerie, l'opzione "-l" specifica la libreria da utilizzare.
Come è scritto chiaramente nel manuale del compilatore GCC l'opzione "-c" compila solamente e genera il file oggetto, non crea nessuna libreria dinamica (anche se ha l'estensione di una libreria dinamica), quindi gli errori a simboli esterni mancanti non vengono giustamente segnalati e se uno lo utilizza come libreria dinamica viene segnalato l'errore che non è una valida libreria dinamica.
Con la funzione di Scilab "ilib_for_link", segnalata in precedenza, genera correttamente la libreria dinamica (almeno sotto Linux non segnalare nessun errore):
Codice: Seleziona tutto
undefined reference to `mxIsNumeric'manca un riferimento esterno a un file oggetto o una libreria con quel simbolo instanziato. Quella funzione si trova nella libreria "libmex.so", infatti nei sorgenti includi il file "mex.h".
Un possibile comando per compilarlo sotto Linux è il seguente:
Codice: Seleziona tutto
gcc -fPIC -O2 -shared -o libunlink.so spm_unlink2.c -I/usr/include/scilab -L/usr/lib/scilab -lmexl'opzione "-I" specifica il percorso dei file include, l'opzione "-L" specifica il percorso delle librerie, l'opzione "-l" specifica la libreria da utilizzare.
Come è scritto chiaramente nel manuale del compilatore GCC l'opzione "-c" compila solamente e genera il file oggetto, non crea nessuna libreria dinamica (anche se ha l'estensione di una libreria dinamica), quindi gli errori a simboli esterni mancanti non vengono giustamente segnalati e se uno lo utilizza come libreria dinamica viene segnalato l'errore che non è una valida libreria dinamica.
Con la funzione di Scilab "ilib_for_link", segnalata in precedenza, genera correttamente la libreria dinamica (almeno sotto Linux non segnalare nessun errore):
Codice: Seleziona tutto
ilib_for_link('myunlink','spm_unlink2.c',[],"c")-
fabrileroy
10 3 - New entry

- Messaggi: 54
- Iscritto il: 1 feb 2011, 13:22
0
voti
[43] Re: Traduzione Matlab-Scilab
se compilo scrivendo questo comando (sono in Windows):
dopo "-I" ho aggiunto il path dove è contenuto il file "mex.h"
mi viene ritornato il seguente errore:
c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot fin
d -lmex
collect2: ld returned 1 exit status
Codice: Seleziona tutto
gcc -O2 -shared -o libunlink.so spm_unlink2.c -I C:\Programmi\scilab-5.3.0\modules\mexlib\includes -L C:\Programmi\scilab-5.3.0\libs -lmex
dopo "-I" ho aggiunto il path dove è contenuto il file "mex.h"
mi viene ritornato il seguente errore:
c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot fin
d -lmex
collect2: ld returned 1 exit status
0
voti
[44] Re: Traduzione Matlab-Scilab
L'errore è chiarissimo, basta leggerlo:
non trova la libreria "mex" (sotto Linux il nome è "libmex.so"), ovviamente dipende dall'opzione "-L''.
Codice: Seleziona tutto
c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot find -lmexnon trova la libreria "mex" (sotto Linux il nome è "libmex.so"), ovviamente dipende dall'opzione "-L''.
-
fabrileroy
10 3 - New entry

- Messaggi: 54
- Iscritto il: 1 feb 2011, 13:22
0
voti
[45] Re: Traduzione Matlab-Scilab
Ciao, non riesco a fare la call della funzione C che ti ho allegato precedentemente (spm_unlink2.c),
io digito
"call('myunlink', 1, 3, 'i', matname, 4, 'c', "out", [1,1], 2, 'd', 0, 1, 'i');" ma mi ritorna sempre un errore del tipo:
"call: L'argomento in ingresso 14 è di tipo sbagliato: era attesa una matrice reale o complessa."
e non capisco dove sbaglio
THX !!
io digito
"call('myunlink', 1, 3, 'i', matname, 4, 'c', "out", [1,1], 2, 'd', 0, 1, 'i');" ma mi ritorna sempre un errore del tipo:
"call: L'argomento in ingresso 14 è di tipo sbagliato: era attesa una matrice reale o complessa."
e non capisco dove sbaglio
THX !!
0
voti
[46] Re: Traduzione Matlab-Scilab
Quella funzione in C non rispetta le convenzioni dei passaggi dei paramenti, per Scilab tutti i parametri devono essere puntatori, usi il tipo 'c' quando non c'è nessun puntatore di caratteri come parametro. Consiglio di leggere meglio la documentazione:
http://help.scilab.org/docs/5.3.0/en_US/call.html
http://help.scilab.org/docs/5.3.0/en_US/call.html
-
fabrileroy
10 3 - New entry

- Messaggi: 54
- Iscritto il: 1 feb 2011, 13:22
0
voti
[47] Re: Traduzione Matlab-Scilab
Anche modificandola in questo modo (allegato) tutto sommato non capisco perché quando faccio la call:
"call('myunlink', matname, 3, 'c', 1, 2, 'i', "out", [1,1], 1, 'c');"
mi restituisce:
Warning !!!
Scilab has found a critical error (EXCEPTION_ACCESS_VIOLATION)
with "call" function.
Save your data and restart Scilab.
matname=
"C:\Documents and Settings\User\Desktop\San Raffaele\Scilab\spm\sssnLaragione_A_MBqcc_f.mat"
"call('myunlink', matname, 3, 'c', 1, 2, 'i', "out", [1,1], 1, 'c');"
mi restituisce:
Warning !!!
Scilab has found a critical error (EXCEPTION_ACCESS_VIOLATION)
with "call" function.
Save your data and restart Scilab.
matname=
"C:\Documents and Settings\User\Desktop\San Raffaele\Scilab\spm\sssnLaragione_A_MBqcc_f.mat"
- Allegati
-
spm_unlink2.zip- (807 Byte) Scaricato 127 volte
0
voti
[48] Re: Traduzione Matlab-Scilab
E' il minimo che ti può succedere se sbagli a comunicare i tipi e/o i parametri, il programma può saltare in modo brutale. Ad esempio "matname" è una stringa in Scilab ma nel sorgente in C il terzo parametro è un puntatore di puntatori a mxArray, sono totalmente incompatibili. Nei sorgenti in C il secondo parametro "nrhs" è un puntatore a un intero ma poi usi il puntatore come se fosse un intero !!! errore gravissimo.
-
fabrileroy
10 3 - New entry

- Messaggi: 54
- Iscritto il: 1 feb 2011, 13:22
0
voti
[49] Re: Traduzione Matlab-Scilab
hai ragione, il problema è che non riesco a chiamare quella funzione con Scilab, non capisco cosa vuole di input la funzione C. Io so solo che vorrei passargli "matname" e che lei svolgesse il suo compito.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

