gnss-sdr源代码编译

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
gnss-sdr源代码编译_第1张图片

      经过对代码的追踪,发现在GNSSBlockFactory::GetBlock(...) 函数中

#if OSMOSDR_DRIVER
    else if (implementation.compare("Osmosdr_Signal_Source") == 0)
        {
            std::unique_ptr 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装的啥?

gnss-sdr源代码编译_第2张图片

      这个问题导致我再把gr-osmosdr的代码阅读了一遍,哎,泪啊~     

      解决问题的过程是艰难的,但是解决问题是容易的。     

     安装gr-osmosdr的时候有:

gnss-sdr源代码编译_第3张图片

      其中有个:

-- Installing: /usr/local/include/osmosdr/source.h

      这个是个好东西,因为

      这个文件里用了

            // 1. Make the driver instance
            try
            {
                    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 ldconfig
Done!

            

你可能感兴趣的:(LimeSDR,GNSS)