对“main'”的未定义引用;在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

嗨,我在使用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 <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.c文件中包含“svdpi.h”
    (或者您没有显示它,因为它在fftwc.h中)。这是新闻部所需要的
  • 您正在编译要与SystemVerilog模拟器一起使用的DPI库。因此,您不需要
    main()
    方法
  • 我更喜欢在SystemVerilog编译器之外编译所有DPI方法。将DPI库包括到仿真阶段。我的流程如下所示:
如果您无法通过gcc的第一个阶段,那么您的问题显然在C端


我目前无法访问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