Ich habe eine C-code which works fine
mit Makefile. Jetzt versuche ich convert it to mex
file, damit ich es von Matlab ausführen kann. Auch hier bin ich using makefile approach
. Aber Makefile für Mex gibt mir einen Fehler.
Hier ist die tsnnls lib , die ich zusammen mit meiner mex-Datei kompilieren möchte.
Organisation des C-Projekts:
%Vor% " Include_4_TSNNLS.*
" Dateien haben die Funktion TestingLibraries()
, die 3rd part libraries aufrufen; während ich versuchte, " tsnnls_test_DKU.c
" sehr einfach zu halten wie:
Originalcode: tsnnls_test_DKU.c
%Vor%Nun wurde der Code geändert:
Geänderter Code: tsnnls_test_DKU.c:
%Vor%Originale Datei erstellen (das funktioniert
%Vor%Geändertes Makefile, das nicht ausgeführt wird Beachten Sie, dass ich den Linking-Teil mit gcc-Compiler auf Original umgestellt habe. Allerdings würde ich gerne Mex hier verwenden.
Ich habe eine Zeile basierend auf meinem Verständnis geändert und das Tag "# mex" verwendet.
Auch Include_4_TSNNLS.o wird erfolgreich erstellt. Auch das vorherige Problem mit "include" wurde behoben, indem alle Pfade fest verdrahtet wurden.
%Vor%Ich bekomme folgende Verknüpfungsfehler:
%Vor%Könnte mir bitte jemand mit den Verknüpfungsoptionen helfen?
Das Problem besteht darin, dass alle in $ (OBJS_tsnnls0) (oder zumindest libtsnnls_la-taucs_ccs_order.o) aufgelisteten Objektdateien ohne die Option -fPIC gcc compiler kompiliert wurden. Die gcc man-Seite sagt für -fPIC
Erzeuge positionsunabhängigen Code (PIC), der für die Verwendung in a geeignet ist Gemeinsame Bibliothek
Beachten Sie, dass MEX-Dateien gemeinsam genutzte Bibliotheken sind. Somit verbindet sich der gesamte Objektcode perfekt mit einer eigenständigen ausführbaren Datei (die keine PIC erfordert), aber sie ist nicht kompiliert, um direkt in eine MEX-Datei (oder irgendeine gemeinsam genutzte Bibliothek) zu verlinken. Wenn Sie die ursprünglichen Quelldateien haben, sollten Sie in der Lage sein, sie mit den richtigen Optionen neu zu kompilieren, indem Sie
ausführen$ (MEX) -c -o Dateiname .o Dateiname .c
für jede der Quelldateien.
Sie haben eine zirkuläre Abhängigkeit von tsnnls_test_DKU.o
, weil OBJS_tsnnlsAll
erweitert wird, um OBJS_tsnnls1
einzuschließen, das in der ersten Zeile des Makefiles als tsnnls_test_DKU.o
definiert ist.
Sie haben auch keine Regel, um OBJS_tsnnlsAll
zu erstellen. Sie übergeben nur die Namen aller Objektdateien an den Compiler, der sie aufgrund des -c
-Flags ignoriert.
Sie sollten $(OBJS_tsnnlsALL)
aus der Regel tsnnls_test_DKU.o
entfernen und tsnnls_test_DKU.o
aus dem endgültigen Ziel entfernen, damit die letzten beiden Regeln wie folgt aussehen: