首页 > 解决方案 > 代码可以在 Debian 10 上编译,但不能在 Ubuntu 20.04 上编译

问题描述

我最近升级到了 Ubuntu 20.04。我意识到gr-gsm没有在存储库中,所以我继续下载 gr-gsm 的源代码并自己编译它。

不幸的是,Ubuntu 20.04 中的 gnuradio 版本对于 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 的“旧”代码才能发生这种情况。在弹出错误的每个位置都没有在这个 SO Answer中做类似的事情,我不得不等待开发人员更新 gr-gsm。

但是,我在 Debian 10 上重复了相同的步骤,即

  1. 从源代码“gnuradio 3.7”下载并编译它。
  2. 从源代码下载 gr-gsm 并着手编译它。

出乎意料的是它编译得很好。

Debian 10 上的 GCC 版本是 8.3。Ubuntu 20.04 上的 GCC 版本是 9.3。

我认为这至多是两个 GCC 版本中使用不同 C++ 标准的问题。所以我通过了-std=c++11,-std=c++14-std=c++17CMAKE_CXX_FLAG了 Debian 10 构建试图打破它。没有任何改变,它成功构建。

另一方面,无论我是否通过-std=c++11-std=c++14Ubuntu -std=c++1720.04CMAKE_CXX_FLAG版本,都没有改变;同样的错误仍然弹出。

那么,在 GCC8.3 和 GCC9.3 之间究竟有什么不同,允许从第一个成功构建同一段代码,但不能从后者成功构建?事实上,考虑到 Ubuntu 是 Debian 的派生发行版,更是如此。

标签: c++ubuntug++debian

解决方案


推荐阅读