gnss-sdr源代码编译
作者微信公众号:小卫星
操作系统: Ubuntu18.04 LTS
1、安装
sudo apt-get install build-essential cmake git libboost-dev \
libboost-date-time-dev libboost-system-dev libboost-filesystem-dev \
libboost-thread-dev libboost-chrono-dev libboost-serialization-dev \
libboost-program-options-dev libboost-test-dev liblog4cpp5-dev \
libuhd-dev gnuradio-dev gr-osmosdr libblas-dev liblapack-dev \
libarmadillo-dev libgflags-dev libgoogle-glog-dev libhdf5-dev \
libgnutls-openssl-dev libmatio-dev python-mako python-six \
libpcap-dev libgtest-dev googletest
git clone https://github.com/gnss-sdr/gnss-sdr
cd gnss-sdr/build
git checkout next
cmake ..
make
sudo make install
wy@wy-Vostro-3668:~/limegnss/gnss-sdr/install$ ./gnss-sdr --config_file=./../../limesdr_GPS_L1.conf
记住,如果以前装过gnss-sdr,一定要在这个目录下这样运行,否则不是自己编译的结果。
正如众多写blog的苦逼的程序员一样,事情如果这么顺利,那一定不正常,也就没有必要写一篇blog了。
2、解决问题1
一般都没有这么顺利,我第一次是出现了错误:
E0616 22:13:53.212085 17236 gnss_block_factory.cc:1119] SignalSource.osmosdr_Signal_Source: Undefined implementation for block
经过对代码的追踪,发现在GNSSBlockFactory::GetBlock(...) 函数中
#if OSMOSDR_DRIVERelse if (implementation.compare("Osmosdr_Signal_Source") == 0)
{
std::unique_ptr<GNSSBlockInterface> block_(new OsmosdrSignalSource(configuration.get(), role, in_streams,
out_streams, queue));
block = std::move(block_);
}
#endif
其中,只有implementation和Osmosdr_Signal_Source完全相同时才会进行下去,因此将conf字段中
;######### SIGNAL_SOURCE CONFIG ############
SignalSource.implementation=Osmosdr_Signal_Source
改的完全正确才可以,一个字符都不能差。
话说这个问题花费了我几乎一个星期时间,几乎把gnss-sdr的跟踪前的代码都看了一遍,还加了n多的cout来追踪代码执行流程,不说了,泪多的很,不过阅读这个代码也不是毫无益处,(这个地方其实还涉及了gnuradio的代码),此容后表。
话说写gnss-sdr的人真是gunradio的忠实粉丝啊,架构和编程语言的运用几乎和gnuradio风格高度一致,果然,高手都是相似的,不是我们凡人能理解的。
2、解决问题2
第二次是这个问题
gr-osmosdr v0.1.4-98-gc653754d (0.1.5git) gnuradio 3.7.11
built-in source types: file fcd rtl_tcp uhd rfspace soapy redpitaya
[INFO] Make connection: ''
FATAL: Failed to make connection with ''
Trying to fill up 1 missing channel(s) with null source(s).
This is being done to prevent the application from crashing
due to gnuradio bug #528.
这里暗示,在gr-osmosdr中没有支持osmosdr,what?没有osmosdr,那我的gr-osmosdr装的啥?
这个问题导致我再把gr-osmosdr的代码阅读了一遍,哎,泪啊~
解决问题的过程是艰难的,但是解决问题是容易的。
安装gr-osmosdr的时候有:
其中有个:
-- Installing: /usr/local/include/osmosdr/source.h
这个是个好东西,因为
这个文件里用了
// 1. Make the driver instancetry
{
if (!osmosdr_args_.empty())
{
std::cout << "OsmoSdr arguments: " << osmosdr_args_ << std::endl;
LOG(INFO) << "OsmoSdr arguments: " << osmosdr_args_;
}
osmosdr_source_ = osmosdr::source::make(osmosdr_args_);
}
make这个函数其是
中的。
然后是确保
-- ######################################################
-- # Gnuradio enabled components
-- ######################################################
-- * Python support
-- * Osmocom IQ Imbalance Correction
-- * sysmocom OsmoSDR
-- * FUNcube Dongle
-- * FUNcube Dongle Pro+
-- * IQ File Source & Sink
-- * RTLSDR TCP Client
-- * Ettus USRP Devices
-- * RFSPACE Receivers
-- * SoapySDR support
-- * Red Pitaya SDR
--
-- ######################################################
中使能列表里含有sysmocom OsmoSDR,当然,还有SoapySDR support。
方法是在gr-osmosdr的cmake ../时加入参数,加啥参数呢?
先执行下cmake ../,自然就有这个列表和诸如
-- Configuring sysmocom OsmoSDR support...
-- Dependency LIBOSMOSDR_FOUND = TRUE
-- Enabling sysmocom OsmoSDR support.
-- Override with -DENABLE_OSMOSDR=ON/OFF
的语句告诉你该咋样做。
最后,告诉大家这第二个问题的解决方法:把gr-osmosdr重装一遍:
git clone git://git.osmocom.org/gr-osmosdr cd gr-osmosdr/ mkdir build cd build/ cmake ../ make sudo make install sudo ldconfigDone!