您当前的位置:首页 > 电子 > 开发板/开源硬件

树莓派编译dump1090报错解决方法

时间:07-21来源:作者:点击数:

这两天又想折腾接收飞机的1090M信号玩了,之前弄过N次,这次把天线扔到一个不怎么起眼的地方,希望能够长期接收。主机当然用树莓派,

安装源里其实就有编译好的dump1090可以直接安装,不过做为喜欢折腾的人可不愿意用现成的(其实后面看来自己折腾就是浪费生命),上github查了下,dump1090现在有以下几个版本:

pi@raspberrypi:~/dump1090-orig/dump1090-master $ make
cc -g -o dump1090 dump1090.o anet.o  -L -lrtlsdr -lpthread -lm
/usr/bin/ld: dump1090.o: in function `modesInitRTLSDR':
/home/pi/dump1090-orig/dump1090-master/dump1090.c:342: undefined reference to `rtlsdr_get_device_count'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:350: undefined reference to `rtlsdr_get_device_usb_strings'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:355: undefined reference to `rtlsdr_open'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:362: undefined reference to `rtlsdr_set_tuner_gain_mode'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:374: undefined reference to `rtlsdr_set_tuner_gain'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:379: undefined reference to `rtlsdr_set_freq_correction'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:381: undefined reference to `rtlsdr_set_center_freq'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:382: undefined reference to `rtlsdr_set_sample_rate'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:383: undefined reference to `rtlsdr_reset_buffer'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:385: undefined reference to `rtlsdr_get_tuner_gain'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:380: undefined reference to `rtlsdr_set_agc_mode'
/usr/bin/ld: /home/pi/dump1090-orig/dump1090-master/dump1090.c:370: undefined reference to `rtlsdr_get_tuner_gains'
/usr/bin/ld: dump1090.o: in function `readerThreadEntryPoint':
/home/pi/dump1090-orig/dump1090-master/dump1090.c:472: undefined reference to `rtlsdr_read_async'
/usr/bin/ld: dump1090.o: in function `main':
/home/pi/dump1090-orig/dump1090-master/dump1090.c:2655: undefined reference to `rtlsdr_close'
collect2: error: ld returned 1 exit status
make: *** [Makefile:12: dump1090] Error 1

刚开始看到这里我还是比较崩溃的,因为编译都已经过了,连接出了问题,说函数找不到定义,看了看Makefile

pi@raspberrypi:~/dump1090-orig/dump1090-master $ cat Makefile 
CFLAGS?=-O2 -g -Wall -W $(shell pkg-config --cflags librtlsdr)
LDLIBS+=$(shell pkg-config --libs librtlsdr) -lpthread -lm
CC?=gcc
PROGNAME=dump1090

all: dump1090

%.o: %.c
        $(CC) $(CFLAGS) -c $<

dump1090: dump1090.o anet.o
        $(CC) -g -o dump1090 dump1090.o anet.o $(LDFLAGS) $(LDLIBS)

clean:
        rm -f *.o dump1090

看起来也没啥,很简单,但有shell取值,手工运行了一下。

pi@raspberrypi:~/dump1090-orig/dump1090-master $ pkg-config --libs librtlsdr
-L -lrtlsdr

这个百度了一下,涉及到2个参数[^1],

  • LDFLAGS,LDFLAGS告诉连接器要连接库的查找路径.-L
  • LIBS,LIBS告诉链接器要链接哪些库文件。-l
    但实际使用的时候,这2个参数都会传给连接器,所以放在一行也没问题。
    上面的输出可以看出LDFLAGS -L 后面试没有跟路径的,他会在系统默认路径查找。但实际我们查看librtlsdr的动态链接库文件路径
pi@raspberrypi:~/dump1090-orig/dump1090-master $ dpkg -L librtlsdr-dev
/.
/usr
/usr/include
/usr/include/rtl-sdr.h
/usr/include/rtl-sdr_export.h
/usr/lib
/usr/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf/cmake
/usr/lib/arm-linux-gnueabihf/cmake/rtlsdr
/usr/lib/arm-linux-gnueabihf/cmake/rtlsdr/rtlsdrConfig.cmake
/usr/lib/arm-linux-gnueabihf/cmake/rtlsdr/rtlsdrConfigVersion.cmake
/usr/lib/arm-linux-gnueabihf/cmake/rtlsdr/rtlsdrTargets-relwithdebinfo.cmake
/usr/lib/arm-linux-gnueabihf/cmake/rtlsdr/rtlsdrTargets.cmake
/usr/lib/arm-linux-gnueabihf/librtlsdr.a
/usr/lib/arm-linux-gnueabihf/pkgconfig
/usr/lib/arm-linux-gnueabihf/pkgconfig/librtlsdr.pc
/usr/share
/usr/share/doc
/usr/share/doc/librtlsdr-dev
/usr/share/doc/librtlsdr-dev/README.Debian
/usr/share/doc/librtlsdr-dev/changelog.Debian.gz
/usr/share/doc/librtlsdr-dev/copyright
/usr/lib/arm-linux-gnueabihf/librtlsdr.so

貌似/usr/lib/arm-linux-gnueabihf/librtlsdr.so这个路径还真不像系统标准路径。不管那么多,直接给/usr/lib/arm-linux-gnueabihf/这个路径加到Makefile里,然后再make就通过了,运行也一切正常。

最后成功了收到的飞机效果图如下:

dump1090
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门