undefined reference to `main' in C
Hallo, ich erhalte folgende Fehlermeldung beim kompilieren von c-code mit gcc
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
Ich versuche zu importieren, die fftw()
Funktion in SystemVerilog. Hier ist mein code
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <fftw3.h>
void fftw(double FFT_in[],int size)
{
double *IFFT_out;
int i;
fftw_complex *middle;
fftw_plan fft;
fftw_plan ifft;
middle = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*size);
IFFT_out = (double *) malloc(size*sizeof(double));
fft = fftw_plan_dft_r2c_1d(size, FFT_in, middle, FFTW_ESTIMATE); //Setup fftw plan for fft (real 1D data)
ifft = fftw_plan_dft_c2r_1d(size, middle, IFFT_out, FFTW_ESTIMATE); //Setup fftw plan for ifft
fftw_execute(fft);
fftw_execute(ifft);
printf("Input: \tFFT_coefficient[i][0] \tFFT_coefficient[i][1] \tRecovered Output:\n");
for(i=0;i<size;i++)
printf("%f\t%f\t\t\t%f\t\t\t%f\n",FFT_in[i],middle[i][0],middle[i][1],IFFT_out[i]/size);
fftw_destroy_plan(fft);
fftw_destroy_plan(ifft);
fftw_free(middle);
free(IFFT_out);
//return IFFT_out;
}
Hier ist ein system Verilog-code aus, wo ich bin versucht zu rufen fftw
module top;
import "DPI-C" function void fftw(real FFT_in[0:11], int size);
real j [0:11];
integer i,size;
real FFT_in [0:11];
initial begin
size = 12;
FFT_in[0] = 0.1;
FFT_in[1] = 0.6;
FFT_in[2] = 0.1;
FFT_in[3] = 0.4;
FFT_in[4] = 0.5;
FFT_in[5] = 0.0;
FFT_in[6] = 0.8;
FFT_in[7] = 0.7;
FFT_in[8] = 0.8;
FFT_in[9] = 0.6;
FFT_in[10] = 0.1;
FFT_in[11] = 0.0;
$display("Entering in SystemVerilog Initial Block\n");
#20
fftw(FFT_in,size);
$display("Printing recovered output from system verilog\n");
//for(i=0;i<size;i++)
//$display("%f\t\n",(j[i])/size);
$display("Exiting from SystemVerilog Initial Block");
#5 $finish;
end
endmodule
Hier ist ein irun Befehl zu kompilieren systemverilg und C-Dateien
# Compile the SystemVerilog files
fftw_test.sv
-access +rwc
# Generate a header file called _sv_export.h
-dpiheader _sv_export.h
# Delay compilation of fftw_test.c until after elaboration
#-cpost fftw_test_DPI.c -end
-I/home/fftw/local/include -L/home/ss69/fftw/local/lib fftw_test_DPI.c -lfftw3 -lm
# Redirect output of ncsc_run to a log file called ncsc_run.log
-log_ncsc_run ncsc_run.log
beim ausführen dieses Befehls folgende Fehlermeldung:
Gebäude Bibliothek führen.so
ld: /home/fftw/local/lib/libfftw3.ein(mapflags.o): Umzug R_X86_64_32 gegen `.rodata' kann nicht verwendet werden, wenn ein gemeinsames Objekt; recompile with-fPIC
/homefftw/local/lib/libfftw3.a: konnte nicht Lesen symbols: Bad value
collect2: ld zurückgegeben, 1 exit status
Hersteller: * [/home/ss69/DPI/./INCA_libs/irun.lnx8664.12.20.nc/librun.so] Fehler 1
ncsc_run: * * * E,TBBLDF: Fehler beim build-test-Bibliothek
/home/DPI/./INCA_libs/irun.lnx8664.12.20.nc/librun.so
irun: * * * E,CCERR: Fehler bei der cc-compilation (status 1), exiting.
Wenn ich einfach versuchen, das zu kompilieren C mit gcc mit nachstehenden Befehl:
gcc -g-Wall -Werror -I/home/fftw/local/include -L/home/ss69/fftw/local/lib \
fftw_test_DPI.c -lfftw3 -lm -o fftw_test_DPI
Bekomme ich diesen Fehler:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o: In Funktion _start':
main'
(.text+0x20): undefined reference to
collect2: ld zurückgegeben, 1 exit status
"Ich habe nicht eine main-Funktion, aber der linker sagt mir, dass ich nicht über eine main-Funktion..." - willkommen auf der Tautologie Club.
Vielleicht wollte Sie einfach nur kompilieren, nicht link (-c)
warum nimmst du nicht ein paar Augenblicke um zu verstehen, die Benutzer? Die meisten Menschen sind ehrlich in Ihrer Vorgehensweise und haben, aus Ihrer Sicht eine berechtigte Frage.
basierend auf Ihre Frage und einen Kommentar in eine Antwort, ich glaube, Sie brauchen zum Lesen eine grundlegende C-Buch zu verstehen, wie ein C-Programm zusammen gestellt werden. Du bist fehlen einige sehr einfache Konzepte.
InformationsquelleAutor sanforyou | 2013-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genau, wie verwenden Sie die Funktion
void fftw(double FFT_in[],int size)
aus Ihren Kommentaren klingt es wie der Codierung routine, die aufgerufen wird, als DLL oder als Teil einer statischen Bibliothek.Wenn dies der Fall ist, dann hinzufügen
main()
ist nicht zu helfen.Was Sie geschrieben haben ist ABSOLUT 100% OK, wenn es verwendet werden, als eine aufrufbare routine.
Dem, was Sie vielleicht tun müssen, ist, kompilieren Sie diese routine in eine Bibliothek, noch eine statische lib. ist wohl ok. Wenn dies der Fall ist, dann Fragen Sie Ihren GCC-Dokumentation nach, wie Sie eine statische oder dynamische lib.
Schließlich, dass ich geschrieben habe Verilog-code selbst, so können Sie auch beliebige Zeilen oder Verweise auf Verilog-Dokumentation, die Sie gelesen haben und deren Anweisungen Sie Folgen. Ich gehe davon aus, dass Sie irgendwann aufrufen Verilog und versorgen Sie mit einer Liste von Bibliotheken, die es können/sollen. Deine lib einbezogen werden sollten in dieser Liste.
Bin, einschließlich der Kommentare von jxh pro seine Anfrage:
Importieren Sie die Funktion in SystemVerilog, müssen Sie kompilieren Sie Ihre Funktion in einem shared object. Dann würden Sie zeigen SystemVerilog am gemeinsamen Objekt. (Ich weiß nicht verwenden, SystemVerilog, aber das ist das, was ich entnehme Ihrer web-Seite.)
Danke @JackCColeman,Michael und jxh ich habe aktualisiert mein system verilog-code als auch in meinem ersten post.. Auch habe ich eine run-Datei zum ausführen von system-verilog und C unter Verwendung von irun Befehl. Ich bin weder in der Lage zu kompilieren, nur C-code mit gcc oder beide codes mit irun..
Greg hat einige zusätzliche Informationen.
InformationsquelleAutor JackCColeman
#include "svdpi.h"
im fftwc.c-Datei (oder vielleicht sind Sie nicht zeigen, weil es in fftwc.h). Dieses include ist notwendig für die DPI.main()
Methode.Wenn Sie nicht bekommen, vorbei an den ersten gcc-Bühne, dann ist dein Problem klar auf der C-Seite.
Ich nicht haben Zugang zu der fftw3-Bibliothek im moment. Ich wundere mich, Ihr
void fftw(double FFT_in[],int size)
könnte Stress für eine library-Funktion. Versuchen Sie esvoid dpi_fftw(double FFT_in[],int size)
'-O2' ist ein level-2-Optimierer. '-Rohr " benutzt pipes statt temporärer Dateien für die Kommunikation zwischen den verschiedenen Stufen des übersetzungsvorganges. Die Optionen gab mir die besten Ergebnisse(wird evtl. nicht benötigt). Der Letzte Schritt ist, zwischen verschiedenen Simulatoren. In diesem Stadium muss dem simulator zu wissen, was binäre laufen mit oder erfordern eine intermediate-linker Bühne. Sie müssen schauen, wie Sie Ihre spezifischen simulator funktioniert. '-sv_lib' und '-sv_root' gemeinsam scheinen simulator Optionen zum einschließen von DPI-Bibliotheken zwischen Simulatoren. (doulos.com/knowhow/sysverilog/tutorial/dpi)
Ich habe gerade bemerkt Ihren Fehler bezieht sich auf einen lib64. Wenn Ihr mit einer 64-bit-simulator dann add '-m64' des gcc am kompilieren Bühne. Wenn Sie Ihre simulator ist 32-bit eine 64-bit-Maschine, dann möchten Sie vielleicht, "- m32 " statt.
Ich Hinzugefügt -m64-option beim kompilieren. Ich bin mit irun für die Simulation von systemverilog. irun verwendet ncsim zur Simulation von systemverilog. also nach erstellen der shared library, habe ich versucht zu simulieren mit "irun -snshlib libdpi."aber ich erhalte eine Fehlermeldung, es doent erkannt fftw Funktionen.. unten ist die komplette Fehlermeldung: irun: * * * E,SNLDLIB: in der Lage, laden Sie die dynamische Bibliothek /home/ss69/DPI/libdpi.so. rundynlib - Fehler beim laden der mitgelieferten library /home/ss69/DPI/libdpi.also OS MSG: /home/ss69/DPI/libdpi.so: undefined symbol: fftw_plan_dft_r2c_1d
Versucht, " irun -sv_lib libdpi.so fftw_test.sv" Noch Ergebnisse in Fehler: Loading snapshot worklib.top:sv .................... Getan ncsim> source /home/netcad - /Trittfrequenz - /INCISIV12.20.010/tools/inca/files/ncsimrc ncsim> ausführen der Eingabe in SystemVerilog Ersten Block
InformationsquelleAutor Greg
Gefunden haben, das folgende tutorial auf Dynamic Programming Interface (DPI) :
Speziell, scrollen Sie nach unten zu "wie der Foreign Language-Code".
Sollte es helfen, mit hintergrund-Informationen zum Konstrukt einen C-Module für SystemVerilog.
Auch, das tutorial hat folgende
import
Aussage:Diese SystemVerilog-Anweisung hat offensichtlich
input
defs auf die Parameter ist dies erforderlich? Ihreimport
NICHT identifizieren-input-vs. output??Ich habe einige Beispiel-DPI-codes, die nicht mit Eingabe-Schlüsselwort und es funktioniert immer noch. Ich glaube nicht, die erforderlich sind, aber gut, um es in Ihrem code.
Ich fand, wo svdpi."h" in svtool installieren Sie Weg.. mit der option-I weisen auf svdpi.h gelöst, das Problem..
InformationsquelleAutor JackCColeman
Du hast keine main-Funktion. Jeder binäre müssen definieren main. Wenn nicht, sollten Sie nicht über einen null-Bereich des Arbeitsspeichers _start definiert, in der Binär, was bedeutet, dass Ihr Programm kann nicht gestartet werden!
Fügen Sie eine Funktion hinzu:
_start
als Einstiegspunkt), es ist nur, dass es einen nicht aufgelösten Verweis aufmain()
.guter Fang
Ich fügte int main () {}, aber immer noch erhalte ich die folgende Fehlermeldung cc1: Warnungen werden als Fehler behandelt fftw_test_DPI.c: In function 'main': fftw_test_DPI.c:7: Fehler: Steuerung erreicht Ende von nicht-void-Funktion. Eigentlich rufe ich fftw von einer system-verilog, damit ich nicht nennen will, wieder von der main.
bearbeitet
Ich bin mir nicht sicher, genau das, was die beteiligten in 'Aufruf fftw von einem system verilog', aber es klingt wie es ' s möglich, dass Sie vielleicht wirklich wollen, eine Bibliothek zu errichten (eine shared-library, Schätze ich), anstatt ein stand-alone-Programm.
InformationsquelleAutor Magn3s1um
Ich glaube, das ist ein Problem mit einigen gcc-linkers. Ich fügte hinzu, die folgenden linker-flag:
Und es wurde das Problem behoben.
InformationsquelleAutor user3716072