我最近升级到Ubuntu 20.04。我意识到gr-gsm是not yet in the repository,所以我继续下载gr-gsm的源代码并自己编译。
不幸的是,Ubuntu 20.04中的gnuradio版本是too new for gr-gsm。因此,我必须首先下载gnuradio 3.7版并从源代码进行编译。成功完成之后,我继续构建gr-gsm。
不幸的是,我不断(从多个位置)收到一个错误,但关于not being able to convert from std::shared_ptr<...> to boost::shared_ptr<...>
却基本相同。
/mnt/Lenovo/projects/gnuradio/gr-gsm/lib/decoding/tch_f_decoder_impl.cc: In static member function ‘static gr::gsm::tch_f_decoder::sptr gr::gsm::tch_f_decoder::make(gr::gsm::tch_mode, bool)’:
/mnt/Lenovo/projects/gnuradio/gr-gsm/lib/decoding/tch_f_decoder_impl.cc:65:9: error: could not convert ‘gnuradio::get_initial_sptr(T*) [with T = gr::gsm::tch_f_decoder_impl]()’ from ‘std::shared_ptr<gr::gsm::tch_f_decoder_impl>’ to ‘gr::gsm::tch_f_decoder::sptr’ {aka ‘boost::shared_ptr<gr::gsm::tch_f_decoder>’}
64 | return gnuradio::get_initial_sptr
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
65 | (new tch_f_decoder_impl(mode, boundary_check));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| std::shared_ptr<gr::gsm::tch_f_decoder_impl>
从这里:
...
control_channels_decoder::make()
{
return gnuradio::get_initial_sptr
(new control_channels_decoder_impl());
}
...
所以我想,到此为止。无法在Ubuntu 20.04上构建gr-gsm,因为编译器版本较新,并且可能需要更新gr-gsm的“旧”代码才能实现。没有在弹出错误的每个位置进行类似this SO Answer的操作,我不得不等待开发人员更新gr-gsm。
但是,我在Debian 10上重复了相同的步骤,即
出乎意料的是,它编译良好。
Debian 10上的GCC版本是8.3。 Ubuntu 20.04的GCC版本是9.3。
我认为这是两个GCC版本中使用不同的C ++标准的最大问题。因此,我将-std=c++11
,-std=c++14
和-std=c++17
传递给CMAKE_CXX_FLAG
到Debian 10构建中,试图对其进行破解。什么都没改变,它成功构建了。
另一方面,无论我将-std=c++11
,-std=c++14
还是-std=c++17
传递给CMAKE_CXX_FLAG
到Ubuntu 20.04版本,都没有改变;仍然弹出相同的错误。
那么GCC8.3和GCC9.3之间到底有什么不同,它们允许从前一个成功地构建相同的代码,而从后一个成功地构建相同的代码呢?甚至在考虑到Ubuntu是Debian的衍生发行版时更是如此。