Неопределенная ссылка на `main'в C
Привет я получаю ниже ошибка при компиляции кода AC с помощью 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 <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
Вот команда irun для компиляции файлов systemverilg и C
# 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): перемещение R_X86_64_32 против `.rodata'не может использоваться при создании общего объекта; перекомпилировать с -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), выход.
Когда я просто пытаюсь скомпилировать C, используя gcc с командой ниже:
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 статус выхода
5 ответов
Как именно вы используете функцию void fftw(double FFT_in[],int size)
из ваших комментариев это звучит так, как будто вы кодируете подпрограмму, которая называется DLL или частью статической библиотеки.
Если это так, то добавление main()
вообще не поможет.
То, что вы написали, АБСОЛЮТНО на 100% нормально, если оно будет использоваться в качестве вызываемой программы.
Что вам может понадобиться, это скомпилировать эту подпрограмму в библиотеку, даже статическую библиотеку. наверное нормально Если это так, обратитесь к документации GCC о том, как создать статическую или динамическую библиотеку.
Наконец, я сам написал код Verilog, так что вы также можете предоставить любые строки или ссылки на документацию Verilog, которую вы прочитали, и инструкциям которой вы следуете. Я предполагаю, что в какой-то момент вы вызываете Verilog и предоставляете ему список библиотек, которые он может / должен использовать. Ваша библиотека должна быть включена в этот список.
Включаю комментарии от 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
- Вы пропали
#include "svdpi.h"
в файле fftwc.c (или, может быть, вы не показываете его, потому что он находится в fftwc.h). Это включение необходимо для DPI. - Вы компилируете библиотеку DPI для использования с симулятором SystemVerilog. Поэтому вам не нужно
main()
метод. - Я предпочитаю всегда компилировать все методы DPI вне компилятора SystemVerilog. Включите библиотеку 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)
У вас нет основной функции. Каждый двоичный файл должен определять main. Если этого не произойдет, у вас нет нулевой области памяти, которую _start определяет в двоичном файле, что означает, что ваша программа не может запуститься!
Добавить функцию:
int main(){
fftw(doubleArgumentsArray, intArgument); //Or whatever function calls this function
return 1; //Needed for C89, C99 will automatically return 1
}
Нашли следующее руководство по интерфейсу динамического программирования (DPI):
http://www.doulos.com/knowhow/sysverilog/tutorial/dpi/
В частности, прокрутите вниз до "Включая код иностранного языка".
Это должно помочь с основной информацией о том, как построить модули C для SystemVerilog.
Кроме того, учебник имеет следующее import
заявление:
import "DPI" function void slave_write(input int address, input int data);
Это утверждение SystemVerilog, очевидно, имеет input
зависит от параметров, это требуется? Ваш import
НЕ идентифицирует вход против выхода?
Я считаю, что это проблема с некоторыми линкерами gcc. Я добавил следующий флаг компоновщика:
irun ... -Wld,-B/usr/lib/x86_64-linux-gnu
И это решило проблему.