您好我在使用gcc编译c代码时遇到错误
/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 <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;
}
这是一个系统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:无法构建测试库 /家庭/ 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退出状态
答案 0 :(得分:3)
你是如何在你的评论中使用函数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
答案 1 :(得分:3)
#include "svdpi.h"
(或者您可能没有显示它,因为它位于fftwc.h中)。这包括DPI所需。main()
方法。${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)
答案 2 :(得分:1)
在动态编程接口(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
不识别输入与输出??
答案 3 :(得分:0)
你没有主要功能。每个二进制必须定义main。如果没有,则没有_start在二进制文件中定义的内存空区域,这意味着您的程序无法启动!
添加功能:
int main(){
fftw(doubleArgumentsArray, intArgument); //Or whatever function calls this function
return 1; //Needed for C89, C99 will automatically return 1
}
答案 4 :(得分:0)
我认为这是一些gcc连接器的问题。我添加了以下链接器标志:
irun ... -Wld,-B/usr/lib/x86_64-linux-gnu
它解决了这个问题。