C中对“main”的未定义引用

嗨我在使用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 

我试图将fftw()函数导入SystemVerilog 。 这是我的代码

 #include  #include  #include  #include  #include  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; } 

这是一个系统Verilog代码,我试图调用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 

这是一个编译systemverilg和C文件的irun命令

 # 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 

运行此命令时给出以下错误:构建库run.so ld:/home/fftw/local/lib/libfftw3.a(mapflags.o):在创建共享对象时,不能使用针对`.rodata’的重定位R_X86_64_32; 用-fPIC /homefftw/local/lib/libfftw3.a重新编译:无法读取符号:错误值collect2:ld返回1退出状态make: * [/home/ss69/DPI/./INCA_libs/irun.lnx8664.12.20。 nc / librun.so]错误1 ncsc_run:* E,TBBLDF:无法构建测试库/home/DPI/./INCA_libs/irun.lnx8664.12.20.nc/librun.so

irun:* E,CCERR:cc编译(状态1)期间出错,退出。

当我只是尝试使用gcc使用以下命令编译C时:
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

我收到此错误:

/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o:函数_start': (.text+0x20): undefined reference to main’collect2:ld返回1退出状态

究竟你是如何使用函数void fftw(double FFT_in[],int size)从你的注释中听起来像是编码例程,被称为DLL或作为静态库的一部分。

如果是这种情况,那么添加main()根本不会有帮助。

如果要将其用作可调用程序,那么您所写的内容绝对100%正常。

您可能需要做的是将此例程编译到库中,甚至是静态库。 可能还好。 如果是这种情况,请查阅GCC文档,了解如何创建静态或动态库。

最后,我自己编写了Verilog代码,因此您还可以提供已阅读的Verilog文档的任何行或参考以及您所遵循的说明。 我假设在某些时候你正在调用Verilog并为它提供它可以/应该使用的库列表。 您的lib应该包含在该列表中。

我的请求包括来自jxh的注释:要将函数导入SystemVerilog,需要将函数编译为共享对象。 然后,您将SystemVerilog指向共享对象。 (我不使用SystemVerilog,但这是我从其网页收集的内容。)

 gcc -shared -fPIC -g -Wall -Werror \ -I/home/ss69/fftw/local/include -L/home/ss69/fftw/local/lib \ fftw_test_DPI.c -lfftw3 -lm -o libfftw_test_DPI.so 
  • 您在fftwc.c文件中缺少#include "svdpi.h" (或者您可能没有显示它,因为它位于fftwc.h中)。 这包括DPI所需。
  • 您正在编译要与SystemVerilog模拟器一起使用的DPI库。 因此,您不需要main()方法。
  • 我更喜欢始终在SystemVerilog编译器之外编译所有DPI方法。 包括DPI库到模拟阶段。 我的流程如下所示:
 ${SVTOOL} -compile -f svfiles.f -dpi_header gen_dpi_header.h gcc -fPIC -pipe -O2 -c -g \ -I${SVTOOL_PATH}/include -Imy_dpi_dir -I. \ -o fftw_test_DPI.o \ fftw_test_DPI.c gcc -shared -o libdpi.so \ fftw_test_DPI.o [other object files] # then call ${SVTOOL} again for simulation with libdpi.so 

如果你无法通过第一个gcc阶段,那么你的问题显然是在C方面。

我目前无法访问fftw3库。 我想知道你的void fftw(double FFT_in[],int size)可能会破坏库函数。 尝试将其重命名为void dpi_fftw(double FFT_in[],int size)

在动态编程接口(DPI)上找到了以下教程:

  http://www.doulos.com/knowhow/sysverilog/tutorial/dpi/ 

具体来说,向下滚动到“包括外语代码”。

它应该有助于提供有关如何为SystemVerilog构建C模块的背景信息。

此外,本教程还包含以下import语句:

  import "DPI" function void slave_write(input int address, input int data); 

这个SystemVerilog声明显然对参数有input defs,这是必需的吗? 你的import不识别输入与输出?

你没有主要function。 每个二进制必须定义main。 如果没有,则没有_start在二进制文件中定义的内存空区域,这意味着您的程序无法启动!

添加function:

 int main(){ fftw(doubleArgumentsArray, intArgument); //Or whatever function calls this function return 1; //Needed for C89, C99 will automatically return 1 } 

我相信这是一些gcc链接器的问题。 我添加了以下链接器标志:

 irun ... -Wld,-B/usr/lib/x86_64-linux-gnu 

它解决了这个问题。