gpt4 book ai didi

c - 在启用线程和 float 的情况下使用 fftw3.3.6 时 undefined reference

转载 作者:行者123 更新时间:2023-12-03 12:47:00 24 4
gpt4 key购买 nike

我在我的 Ubuntu 16.04 上安装了 fftw3.3.6 来测试在启用线程和浮点的情况下使用这个库的性能。

第一步:

安装了启用了线程和浮点以及 SIMD 指令的库:`

sudo ./configure --enable-float --enable-generic-simd128 --enable-generic-simd256 --enable-threads
make
make install

第 2 步:

我编写了这段代码(基于手册和教程)使用 4 个线程(从复杂到复杂)计算 1024 个点的 fft:

#include <stdio.h>
#include <stdlib.h>
#include <fftw3.h>

#include "input.h"

#define NUMBER_OF_ELEMENTS 1024
#define NUM_THREADS 4

void Load_inputs(fftwf_complex* data)
{
int i;

for(i=0;i<NUMBER_OF_ELEMENTS;i++)
{
data[i][0] = input_data[2 * i];
data[i][1] = input_data[2 * i + 1];
}
}


int main()
{
fftwf_complex array[NUMBER_OF_ELEMENTS];
fftwf_plan p;
int i;

fftwf_init_threads();
fftwf_plan_with_nthreads(NUM_THREADS);
p = fftwf_plan_dft(1,NUMBER_OF_ELEMENTS,array,array,FFTW_FORWARD,FFTW_EXHAUSTIVE);
Load_inputs(array); //function to load input data from input.h file to array[]
fftwf_execute(p);
FILE* res = NULL;
res = fopen("result.txt", "w");
for ( i = 0; i <1024; i++ )
{
fprintf(res,"RE = %f \t IM = %f\n",array[i][0], array[i][1] );
}
fclose(res);
fftwf_destroy_plan(p);
fftwf_cleanup_threads();
}

然后,我用这个 makefile 编译了这个程序。

CC=gcc
CFLAGS=-g3 -c -Wall -O0 -mavx -mfma -ffast-math

SOURCES=$ test.c
OBJECTS=$(SOURCES:.c=.o)

EXECUTABLE=test


all: $(TASKMAP) $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
$(CC) $(OBJECTS) -o $@ -L -lfftw3f_threads -lfftw3f

.c.o:
$(CC) $(CFLAGS) $< -lm -o $@

clean:
rm -fr $(OBJECTS) $(EXECUTABLE)

编译错误:

编译后出现以下错误:

gcc test.o -o test -L -lfftw3f_threads -lfftw3f 
//usr/local/lib/libfftw3f.a(mapflags.o): In function `fftwf_mapflags':
mapflags.c:(.text+0x346): undefined reference to `__log_finite'
Makefile:13: recipe for target 'test' failed
//usr/local/lib/libfftw3f.a(trig.o): In function `cexpl_sincos':
trig.c:(.text+0x2c1): undefined reference to `sincos'
//usr/local/lib/libfftw3f.a(trig.o): In function `fftwf_mktriggen':
trig.c:(.text+0x50b): undefined reference to `sincos'
trig.c:(.text+0x653): undefined reference to `sincos'
test.o: In function `main':
/home/anouar/workspace/Thread_example//test.c:27: undefined reference to `fftwf_init_threads'
/home/anouar/workspace/Thread_example//test.c:28: undefined reference to `fftwf_plan_with_nthreads'
/home/anouar/workspace/Thread_example//test.c:40: undefined reference to `fftwf_cleanup_threads'
collect2: error: ld returned 1 exit status
make: *** [test] Error 1

是不是我在安装编译的过程中遗漏了什么,或者哪里做错了?

最佳答案

阅读精美的手册。来自 the sincos() man page :

Link with -lm.

在程序的编译 阶段使用-lm 是没有用的:

.c.o:
$(CC) $(CFLAGS) $< -lm -o $@

-lm需要在link阶段:

$(EXECUTABLE): $(OBJECTS) 
$(CC) $(OBJECTS) -o $@ -L -lfftw3f_threads -lfftw3f -lm

关于c - 在启用线程和 float 的情况下使用 fftw3.3.6 时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com