c++ - 代码可以在 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 上重复了相同的步骤,即
- 从源代码“gnuradio 3.7”下载并编译它。
- 从源代码下载 gr-gsm 并着手编译它。
出乎意料的是它编译得很好。
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
Ubuntu -std=c++17
20.04CMAKE_CXX_FLAG
版本,都没有改变;同样的错误仍然弹出。
那么,在 GCC8.3 和 GCC9.3 之间究竟有什么不同,允许从第一个成功构建同一段代码,但不能从后者成功构建?事实上,考虑到 Ubuntu 是 Debian 的派生发行版,更是如此。
解决方案
推荐阅读
- python - linux ModuleNotFoundError:没有名为'_ctypes的模块
- unity3d - 单点触摸在固定高度跳跃:Unity 2D
- django - 在 Django 1.11 更改视图中禁用原子事务
- json - 使用 React 从 Json 传递图像名称
- docker - Docker Swarm:如果所有 swarm 管理器都重新启动会发生什么
- c# - 没有 Visual Studio 的 TwinCAT 3.0 自动化接口?
- reactjs - 对于 Laravel + React 应用程序哪个更好,REST API 调用或刀片包含反应组件?
- javascript - 尝试使用 Heroku 打开我的引导模板时出现 MIME 类型错误
- javascript - 脚本未在 HTML 页面中执行
- c - 从 C 中的函数返回多个值,没有结构、元组和任何其他高于数组级别的东西