最近想用下P4-based software switch,我采用的ubuntu 16.04 LTS,linux内核版本为linux4.18。看的这个教程来:https://blog.csdn.net/qq_34039018/article/details/88843937,这位作者提供的安装过程非常详细,前面都很顺利,但后来还是遇到了些问题,发个帖记录下,给后面遇到同样问题的人提供个方便。
一、遇到的第一个问题出现在安装p4c的过程中,当在"../p4c/build/"的目录下执行"make -j4"时,进度到了[6%]时会遇到如下报错:
In file included from /home/squirrel2/p4/p4c/build/lib/unified_libp4ctoolkit_srcs_1.cpp:2:0:
/home/squirrel2/p4/p4c/lib/backtrace.cpp: In function ‘void std::__throw_system_error(int)’:
/home/squirrel2/p4/p4c/lib/backtrace.cpp:84:31: error: ‘system_error’ is not a member of ‘std’
throw backtrace_exception<std::system_error>(error_code(err, generic_category()));
^
/home/squirrel2/p4/p4c/lib/backtrace.cpp:84:31: error: ‘system_error’ is not a member of ‘std’
/home/squirrel2/p4/p4c/lib/backtrace.cpp:84:48: error: template argument 1 is invalid
throw backtrace_exception<std::system_error>(error_code(err, generic_category()));
^
/home/squirrel2/p4/p4c/lib/backtrace.cpp:84:83: error: ‘generic_category’ was not declared in this scope
throw backtrace_exception<std::system_error>(error_code(err, generic_category()));
^
/home/squirrel2/p4/p4c/lib/backtrace.cpp:84:84: error: ‘error_code’ was not declared in this scope
throw backtrace_exception<std::system_error>(error_code(err, generic_category()));
^
/home/squirrel2/p4/p4c/lib/backtrace.cpp:85:1: warning: ‘noreturn’ function does return
}
^
lib/CMakeFiles/p4ctoolkit.dir/build.make:81: recipe for target 'lib/CMakeFiles/p4ctoolkit.dir/unified_libp4ctoolkit_srcs_1.cpp.o' failed
make[2]: *** [lib/CMakeFiles/p4ctoolkit.dir/unified_libp4ctoolkit_srcs_1.cpp.o] Error 1
CMakeFiles/Makefile2:1054: recipe for target 'lib/CMakeFiles/p4ctoolkit.dir/all' failed
make[1]: *** [lib/CMakeFiles/p4ctoolkit.dir/all] Error 2
Makefile:159: recipe for target 'all' failed
make: *** [all] Error 2
因为刚开始觉得git下载的代码肯定没问题,所以一直关注着failed和error前的提示,所以进行了下面的两个尝试:
1. 以为CMake的版本过低,我的是3.5,升级到最新版的以后重新执行还是报这个问题。
2. 以为是我的linux内核版本过低(最开始用的linux 4.4),把内核版本升级到原作者使用的4.18版本以后还是这样。
最后关注上面代码中的提示:"error is not a member of std",然后按照网上搜到的方法:先找到报error的文件"../p4c/lib/backtrace.cpp",然后把"#include <system_error>"加到头文件,重新"make -j4"问题解决。
二、遇到的第二个问题出现在对p4c进行"make check -j4",遇到的问题如下:

1210个tests里面的前50个会failed,开始觉得无法定位到具体的地方,感觉依赖包还有之前的按照步骤都没问题,为什么就这50个错了。经过一番google,在这里找到了日志文件的所在地点,在p4c/build/目录下的"../build/Testing/Temporary/LastTest.log",打开日志文件后发现原来是前50个需要些python扩展包的支持,按照提示用pip3安装后问题解决。
然而有部分可以pass,依旧有部分failed,继续查看提示发现是for循环的使用上出错,在gcc下(int i=0; i<10; i++)这样用会报错,gcc版本大于5.0好像默认的c11,但是因为之前做ns2和ns3实验,我用的gcc和g++都是选择的比较远古的版本。把代码一个个改正显然是不现实的,这里采用的方法是编辑"~/.bashrc"文件,用alias增加这句定义"alias g++='g++ -std=c++11'", "alias gcc='gcc -std=c11'",问题完全解决~。
"
本文记录了在Ubuntu16.04LTS环境下安装P4C-basedsoftwareswitch过程中遇到的问题及解决办法,包括编译错误和测试失败等问题。

10万+

被折叠的 条评论
为什么被折叠?



