C语言 C 中对“main”的未定义引用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18086992/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
undefined reference to `main' in C
提问by sanforyou
Hi I am getting below error while compiling a c code using gcc
嗨,我在使用 gcc 编译 ac 代码时遇到以下错误
/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
I am trying to import the fftw()function into SystemVerilog. Here is my code
我正在尝试将该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;
}
Here is a system Verilog code from where I am trying to call fftw
这是我试图调用 fftw 的系统 Verilog 代码
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
Here is an irun command to compile both systemverilg and C files
这是一个编译 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
while running this command give below error: building library run.so ld: /home/fftw/local/lib/libfftw3.a(mapflags.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC /homefftw/local/lib/libfftw3.a: could not read symbols: Bad value collect2: ld returned 1 exit status make: *[/home/ss69/DPI/./INCA_libs/irun.lnx8664.12.20.nc/librun.so] Error 1 ncsc_run: *E,TBBLDF: Failed to build test library /home/DPI/./INCA_libs/irun.lnx8664.12.20.nc/librun.so
运行此命令时出现以下错误:构建库 run.so ld: /home/fftw/local/lib/libfftw3.a(mapflags.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; 使用 -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: Error during cc compilation (status 1), exiting.
irun: *E,CCERR: cc 编译期间出错(状态 1),正在退出。
When I simply try to compile C using gcc with below command:
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
当我简单地尝试使用带有以下命令的
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
I get this error:
我收到此错误:
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o: In function _start':
(.text+0x20): undefined reference tomain'
collect2: ld returned 1 exit status
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o:在函数_start':
(.text+0x20): undefined reference tomain'collect2中:ld返回1个退出状态
回答by HymanCColeman
Exactly how are you using the function void fftw(double FFT_in[],int size)from your comments it sounds like you are coding routine that is called as DLL or as part of a static library.
确切地说,您如何void fftw(double FFT_in[],int size)从您的评论中使用该函数,听起来您正在编写称为 DLL 或作为静态库一部分的例程。
If this is the case then adding main()isn't going to help, at all.
如果是这种情况,那么添加main()根本无济于事。
What you have written is ABSOLUTELY 100% OK, if it is to be used as a callable routine.
如果要将其用作可调用例程,则您编写的内容绝对 100% 可以。
What you might need to do is compile this routine into a library, even a static lib. is probably ok. If this is the case then consult your GCC documentation on how to create a static or dynamic lib.
您可能需要做的是将这个例程编译成一个库,甚至是一个静态库。大概没问题。如果是这种情况,请查阅您的 GCC 文档,了解如何创建静态或动态库。
Finally, I have written Verilog code myself, so you can also provide any lines or references to Verilog documentation that you have read and whose instructions you are following. I assume that at some point you are invoking Verilog and supplying it with a list of libraries it can/should use. Your lib should be included in that list.
最后,我自己编写了 Verilog 代码,因此您还可以提供您阅读过的 Verilog 文档的任何行或引用,以及您遵循的说明。我假设在某个时候您正在调用 Verilog 并向它提供它可以/应该使用的库列表。您的库应该包含在该列表中。
Am including comments from jxhper his request: To import the function into SystemVerilog, you need to compile your function into a shared object. Then, you would point SystemVerilog at the shared object. (I don't use SystemVerilog, but that is what I gather from its web page.)
根据他的要求,包括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
回答by Greg
- Your are missing
#include "svdpi.h"in the fftwc.c file (or maybe you are not showing it because it is in fftwc.h). This include is needed for DPI. - You are compiling a DPI library to be used with a SystemVerilog simulator. Therefore, you do not need a
main()method. - I prefer to always compile all DPI methods outside of the SystemVerilog compiler. The include the DPI library to the simulation phase. My flow looks something like the following:
- 您
#include "svdpi.h"在 fftwc.c 文件中丢失了(或者您没有显示它,因为它在 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
If you cannot get past the first gcc stage then your issue is clearly on the C side.
如果您无法通过第一个 gcc 阶段,那么您的问题显然是在 C 方面。
I do not have access to the fftw3 library at the moment. I'm wondering your void fftw(double FFT_in[],int size)might be clobbering a library function. Try renaming it void dpi_fftw(double FFT_in[],int size)
我目前无法访问 fftw3 库。我想知道您void fftw(double FFT_in[],int size)可能正在破坏库函数。尝试重命名void dpi_fftw(double FFT_in[],int size)
回答by Magn3s1um
You have no main function. Every binary must define main. If it doesn't, you don't have a null region of memory that _start defines in the binary, which means your program can't start!
您没有主要功能。每个二进制文件都必须定义 main。如果没有,您就没有 _start 在二进制文件中定义的空内存区域,这意味着您的程序无法启动!
Add a function:
添加一个函数:
int main(){
fftw(doubleArgumentsArray, intArgument); //Or whatever function calls this function
return 1; //Needed for C89, C99 will automatically return 1
}
回答by HymanCColeman
Have found the following tutorial on Dynamic Programming Interface (DPI) :
找到了以下关于动态编程接口 (DPI) 的教程:
http://www.doulos.com/knowhow/sysverilog/tutorial/dpi/
Specifically, scroll down to the "Including Foreign Language Code".
具体来说,向下滚动到“包括外语代码”。
It should help with background information about how to construct a C modules for SystemVerilog.
它应该有助于了解有关如何为 SystemVerilog 构建 C 模块的背景信息。
Also, the tutorial has the following importstatement:
此外,本教程还有以下import声明:
import "DPI" function void slave_write(input int address, input int data);
This SystemVerilog statement obviously has inputdefs on the parameters, is this required? Your importdoes NOT identify input vs. output??
这个 SystemVerilog 语句显然input对参数有定义,这是必需的吗?你import不识别输入与输出?
回答by user3716072
I believe this is an issue with some gcc linkers. I added the following linker flag:
我相信这是一些 gcc 链接器的问题。我添加了以下链接器标志:
irun ... -Wld,-B/usr/lib/x86_64-linux-gnu
And it fixed the issue.
它解决了这个问题。

