对“main'”的未定义引用;在C中
嗨,我在使用gcc编译c代码时遇到以下错误对“main'”的未定义引用;在C中,c,gcc,system-verilog,fftw,system-verilog-dpi,C,Gcc,System Verilog,Fftw,System Verilog Dpi,嗨,我在使用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()函数导入。这是我的密码 #include <stdio.h> #include &l
/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()
函数导入。这是我的密码
#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;
}
运行此命令时,请给出以下错误:
建立图书馆运行.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_运行:*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:在函数
\u start'中:
(.text+0x20):未定义对
main'的引用
collect2:ld返回1退出状态您没有主功能。每个二进制必须定义main。如果没有,你就没有在二进制文件中定义的空内存区域,这意味着你的程序无法启动 添加一个函数:
int main(){
fftw(doubleArgumentsArray, intArgument); //Or whatever function calls this function
return 1; //Needed for C89, C99 will automatically return 1
}
确切地说,您是如何使用函数void fftw(double FFT_in[],int size)从您的注释中可以看出,您正在编写称为DLL或静态库一部分的例程 如果是这种情况,那么添加
main()
将毫无帮助
如果要用作可调用例程,那么您所编写的绝对是100%可以的
您可能需要将这个例程编译成一个库,甚至是一个静态库。可能没问题。如果是这种情况,请查阅GCC文档,了解如何创建静态或动态库
最后,我自己编写了Verilog代码,因此您还可以提供您已经阅读并遵循其说明的Verilog文档的任何行或引用。我假设您在某个时候调用了Verilog,并向它提供了它可以/应该使用的库的列表。您的库应该包含在该列表中
Am根据他的要求包括jxh的评论:
要将函数导入SystemVerilog,需要将函数编译为共享对象。然后,将SystemVerilog指向共享对象。(我不使用SystemVerilog,但这是我从其网页上收集的。)
- 您缺少
(或者您没有显示它,因为它在fftwc.h中)。这是新闻部所需要的#在fftwc.c文件中包含“svdpi.h”
- 您正在编译要与SystemVerilog模拟器一起使用的DPI库。因此,您不需要
方法main()
- 我更喜欢在SystemVerilog编译器之外编译所有DPI方法。将DPI库包括到仿真阶段。我的流程如下所示:
我目前无法访问fftw3库。我想知道您的
void fftw(双FFT_in[],int size)
可能正在破坏库函数。尝试将其重命名为void dpi\u fftw(双FFT\u in[],int size)已找到以下关于动态编程接口(dpi)的教程:
具体而言,向下滚动至“包括外语代码”
它应该有助于提供有关如何为SystemVerilog构建C模块的背景信息
此外,本教程还有以下import
语句:
import "DPI" function void slave_write(input int address, input int data);
这个SystemVerilog语句显然在参数上有
input
defs,这是必需的吗?您的导入
没有识别输入与输出???我认为这是一些gcc链接器的问题。我添加了以下链接器标志:
irun ... -Wld,-B/usr/lib/x86_64-linux-gnu
它解决了这个问题。你有主功能吗?“我没有主功能,但链接器告诉我我没有主功能…”-也许你只是想编译,而不是链接(-c)@H2CO3为什么不花点时间来了解用户?大多数人的方法都是诚实的,从他们的观点来看,他们的问题是正确的。@Sandeep-根据你的问题和回答中的评论,我认为你需要阅读一本基本的C语言书来理解C程序是如何组合在一起的。您缺少了一些非常基本的概念。“如果没有,您就没有二进制的_start标签”-您仍然有(在使用
\u start
作为入口点的实现中),只是它有一个未解析的main()
引用。我添加了int main(){}但我还是发现错误cc1:警告被视为错误fftw_test_DPI.c:在函数“main”中:fftw_test_DPI.c:7:错误:控件到达非void函数的末尾。实际上我是从系统verilog调用fftw,所以我不想再从main调用它。@Sandeep:我不确定“从系统verilog调用fftw”到底涉及到什么,但听起来你可能真的想要构建一个库(我想是共享库)而不是一个独立的程序。请采取一些相关的信息在我的帖子,并纳入到您自己的。我将删除我的帖子。谢谢@jackcleman,Michael和jxh,我已经在我的第一篇帖子中更新了我的系统verilog代码。。我还有一个运行文件,可以使用irun命令运行系统verilog和C。我既不能使用gcc只编译C代码,也不能使用irun编译两个代码。@Greg,我已经包含了#include“svdpi.h”,但当我尝试使用gcc在系统verilog之外编译C文件时,它会给我一个错误,fftw_test_DPI.C:6:20:error:svdpi.h:没有这样的文件或目录。。当我编译ins时,这不是问题
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
${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
http://www.doulos.com/knowhow/sysverilog/tutorial/dpi/
import "DPI" function void slave_write(input int address, input int data);
irun ... -Wld,-B/usr/lib/x86_64-linux-gnu