1

我的目标是编译 Kiss_fft 库以在 JNI 中用于 android 开发。然而,首先,我试图在我的 linux 机器上用 C 语言使用 Kiss_fft 库。

当使用 Kiss_fft ( Kissfft ) 中的 Kiss_fft.c 或 Kiss_fftr.c 计算 DFT 时。您究竟如何将他们的库编译到您自己的文件中。在我的源 C 文件的顶部,我#include Kiss_fft.h 和#include Kiss_fftr.h,并将 Kiss_fft 源代码放在我的项目根目录或 /usr/include/ 中,然后我编译makefile 类似于这个:

#Makefile

#ARGS = -g -ansi -pedantic -Wall -Werror -O1
ARGS = -g -lsndfile -O1 -lm


FILES = spec_subv4.o kiss_fftr.o kiss_fft.o

spec_sub: $(FILES)
gcc $(ARGS) $(FILES) -o spec_sub  

spec_subv4.o:   spec_subv4.c 
gcc -lsndfile $(ARGS) -c spec_subv4.c -o spec_subv4

kiss_fftr.o:    kiss_fftr.c kiss_fftr.h kiss_fftr.h _kiss_fft_guts.h
gcc $(ARGS) -c kiss_fftr.c -o kiss_fftr

kiss_fft.o: kiss_fft.c _kiss_fft_guts.h
gcc $(ARGS) -c kiss_fftr.c -o kiss_fft

查看所有的kiss_fft 源文件,我编写了这个make 文件来构建所有依赖项。但是我仍然得到

undefined reference to kiss_fft

undefined reference to kiss_fft_alloc

哪些是 Kiss_fft 库的内部函数。

任何帮助,将不胜感激。谢谢

4

3 回答 3

2

您的 makefile 目标从未真正编译过 Kiss_fft.c

例如

kiss_fft.o: kiss_fft.c _kiss_fft_guts.h
gcc $(ARGS) -c kiss_fftr.c -o kiss_fft

编译kiss_fftr.c 而不是kiss_fft.c

于 2011-04-21T19:07:33.590 回答
1

我认为符号/函数kiss_fft、kiss_fft_alloc 不属于任何包含的库。

在链接之前必须检查几件事:

  1. 检查库 sndfile 中的符号是否可用

    纳米 | grep "kiss_fft"

  2. 检查您是否在 make 文件中提到了库的 PATH。

    将您的库路径包括为 -L

  3. 检查这些函数的原型是否在更硬的文件中

    将它们包含在 -I 中

  4. 如果使用任何 C,C++ 组合代码

    使用extern "C"语法。

  5. 函数的原型必须与库中包含的原型匹配。

于 2011-04-21T12:46:07.373 回答
1

解决了,感谢您的输入。我只是简单地编译了:

gcc $@ -g -lsndfile -lm -std=gnu99 spec_sub_kiss.c kiss_fft.c kiss_fftr.c -o spec_sub_kiss

-lsndfile 是为我的项目读取和写入一些 .wav 文件的库。

于 2011-04-28T12:34:56.960 回答