2016-09-05 2 views
0

Ich habe Probleme beim Debuggen von C-Code, den ich als Teil eines R-Pakets schreibe. Der Code kompiliert und ausgeführt wird, wenn ich R CMD SHLIB aus der Windows-Konsole (das heißt cmd.exe):Kompilieren von C-Code, der R-Bibliotheken in Netbeans verwendet

>R CMD SHLIB MaximumAgreementForest.c 
gcc -m64 -I"C:/PROGRA~1/R/R-32~1.4RE/include" -DNDEBUG  -I"d:/RCompile/r-compiling/local/local323/include"  -O2 -Wall -std=gnu99 -mtune=core2 -c MaximumAgreementForest.c -o MaximumAgreementForest.o 
gcc -m64 -shared -s -static-libgcc -o MaximumAgreementForest.dll tmp.def MaximumAgreementForest.o -Ld:/RCompile/r-compiling/local/local323/lib/x64 -Ld:/RCompile/r-compiling/local/local323/lib -LC:/PROGRA~1/R/R-32~1.4RE/bin/x64 -lR 

Das Skript auch richtig in Netbeans gebaut, bis ich mit den Funktionen R_alloc und C_alloc aus den R-Bibliotheken gestartet. Jetzt scheint es nicht in der Lage zu sein, die Definitionen einer Anzahl von R-spezifischen Funktionen zu finden. Wenn ich versuche, das Projekt in Netbeans zu bauen die Konsole führt die folgenden Schritte aus:

cd 'C:\Work\Fun\implied_weight\MAF' 
C:\MinGW\msys\1.0\bin\make.exe -f Makefile CONF=Debug 
"/C/MinGW/msys/1.0/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf 
make.exe[1]: Entering directory `/c/Work/Fun/implied_weight/MAF' 
"/C/MinGW/msys/1.0/bin/make.exe" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/libMAF.dll 
make.exe[2]: Entering directory `/c/Work/Fun/implied_weight/MAF' 
mkdir -p build/Debug/MinGW-Windows/_ext/5c0 
rm -f "build/Debug/MinGW-Windows/_ext/5c0/MaximumAgreementForest.o.d" 
gcc -DDEBUG -O2 -Wall -mtune=core2 -c -g -Wall -I/C/Program\ Files/R/R-3.2.4revised/include -MMD -MP -MF "build/Debug/MinGW-Windows/_ext/5c0/MaximumAgreementForest.o.d" -o build/Debug/MinGW-Windows/_ext/5c0/MaximumAgreementForest.o ../MaximumAgreementForest.c 
mkdir -p dist/Debug/MinGW-Windows 
gcc -DDEBUG -O2 -Wall -mtune=core2 -o dist/Debug/MinGW-Windows/libMAF.dll build/Debug/MinGW-Windows/_ext/5c0/MaximumAgreementForest.o -L/C/Program\ Files/R -L/C/Program\ Files/R/R-3.2.4revised/library -shared 
build/Debug/MinGW-Windows/_ext/5c0/MaximumAgreementForest.o: In function `forest_new': 
C:\Work\Fun\implied_weight\MAF/../MaximumAgreementForest.c:37: undefined reference to `R_alloc' 
build/Debug/MinGW-Windows/_ext/5c0/MaximumAgreementForest.o: In function `forest_plant': 
C:\Work\Fun\implied_weight\MAF/../MaximumAgreementForest.c:55: undefined reference to `S_alloc' 
[...] 
C:\Work\Fun\implied_weight\MAF/../MaximumAgreementForest.c:515: undefined reference to `R_chk_free' 
collect2.exe: error: ld returned 1 exit status 

Mein Skript, eine einzelne C-Datei enthält die Zeilen

#define USE_RINTERNALS 
#include <R.h> // which itself #includes R_ext/Memory, R_ext Printf 
#include <R_ext/Print.h> 
#include <R_ext/Memory.h> 
#include <Rinternals.h> 

Herauszufinden, dass Netbeans auf die Punkt versagt relevanten Bibliotheken, habe ich versucht, C:/Program Files/R/R-3.2.4revised/include und C:/Program Files/R/R-3.2.4revised/bin/x64 bei Datei → Projekteigenschaften → Allgemein → Quellordner hinzufügen und entfernen, ohne Wirkung.

Unter Datei → Projekteigenschaften → Build → C Compiler, habe ich C:/Program Files/R/R-3.2.4revised/include enthalten.

Als ich hinzufügen C:/Program Files/R/R-3.2.4revised/bin/x64/R.dll-Generieren → Linker → Bibliotheken → Bibliotheken, über die Bibliothek hinzufügen ... Option, erhalte ich die Fehler c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lR, und die Linker beendet, ohne (vor?) Beschwerte sich über die undefinierte Referenzen .

Wenn ich hinzufügen, anschließend "C:/Programme/R/R-3.2.4revised/ist/x64 /", die vom System PATH bereits in ist, zu Generieren → Linker → Zusätzliche Bibliotheksverzeichnisse, der Compiler schlägt fehl mit der Nachricht C:/Program Files/R/R-3.2.4revised/bin/x64/R.dll: file not recognized: File format not recognized

Was fehlt mir ... wie kann ich Netbeans auf die relevanten R-Bibliotheken zeigen?

+0

Funktioniert nicht mit _R_, aber möglicherweise liegt ein Problem mit dem Befehl vor: _gcc -DDEBUG -O2 -Wall -mtune = core2 -o dist/Debug/MinGW-Windows/libMAF.dll Build/Debug/MinGW- Windows/_ext/5c0/MaximumAgreementForest.o -L/C/Programme \ Dateien/R -L/C/Programme \ Dateien/R/R-3.2.4revised/library -shared_; Sie übergeben eine Reihe von Argumenten (die _gcc_ an den _linker_ übergibt), einschließlich lib-Pfade (['-L'] (https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_2.html#SEC14)), aber Sie haben die Bibliothek selbst nicht eingeschlossen (['-l'] (https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_2.html#SEC13)): wenn' R_alloc' ist in _ (lib) R.dll (.a) _ dann füge _-lR_ hinzu. – CristiFati

+0

Danke für den Vorschlag. Wenn ich R.dll als Bibliothek hinzufüge, fügt Netbeans das -lR automatisch zur gcc-Zeile hinzu, die 'gcc -o dist/Debug/MinGW-Windows/libMAF.dll build/Debug/MinGW-Windows/_ext/5c0 lautet /MaximumAgreementForest.o -L/C/Programme \ Dateien/R/R-3.2.4revised/bin/x64 -lR -shared' – ms609

Antwort

0

Der Fehler File format not recognized tritt auf, wenn ein 32-Bit-Compiler versucht, auf eine 64-Bit-DLL (oder umgekehrt) zu laden. Das Ändern des Pfads C:/Program Files/R/R-3.2.4revised/bin/x64/R.dll zu C:/Program Files/R/R-3.2.4revised/bin/i386/R.dll löste das Problem.

Verwandte Themen