Makefile: Konvertieren von C-Code in Mex-Code (Linking error)

8

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?

    
Garima Singh 12.02.2015, 18:15
quelle

2 Antworten

4

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.

    
SCFrench 29.06.2015 00:28
quelle
2

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:

%Vor%     
Nathan Wilson 01.07.2015 15:24
quelle

Tags und Links