网上有很多同类的帖子,但解决方法都很奇怪,所以这里我从原理上稍微说一下。赶时间可以直接看看以下帖子:
NS3编译错误cc1plus: all warnings being treated as errors解决方法
交叉编译驱动和应用出现警告提示错误“cc1:all warnings being treated as errors”解决方法
本质问题是 waf 在生成配置文件的时候默认添加了 “-Werror” 编译器标记(网上说是 linux 内核从5.15之后构建将默认启用 “-Werror” 编译器标记),编译时 warning 被当作 error 处理。而如果我们要关掉这个标记,只需要去掉这个 -Werror 标记即可。
但网上就很多说法都是说把 NS3 根目录下的 build 文件夹下的 c4che/_cache.py 文件中的 -Werror 标记给去掉,这其实是很费解的一个行为,因为 build 本身就是编译配置文件,是通过 ./waf configure 来生成的,而你在生成之后修改这个 build 的配置文件,实际上是非常不优雅的一件事。当你因为一些事情改了 wscript (例如配置第三方库等)之后,重新执行 ./waf configure,你之前删掉的 -Werror 又改回去了。
实际上我们可以在编译时额外给一个 -Wno-unused 选项即可,而在 NS3 中,由于我们是通过 waf 编译的(并不是直接 gcc / 通过 Makefile 编译),因此需要修改 waf 的文件夹 wscript 来修改,即 NS3 根目录下的 wscript。
其中有两种修改方法,第一种是直接在 def configure 函数中对编译环境进行修改,即添加如下代码:
def configure():
...
conf.env.append_value("CXXFLAGS", ["-Wno-error"]);
...
实际上就是在编译时添加了一个新的 CXXFLAGS,即 -Wno-error。执行以上操作之后,一定要记得 ./waf clean 清楚 build 目录下的文件,然后通过 ./waf configure 重新生成 build 编译配置,最后再通过 ./waf build 编译即不会出现上述错误。
第二种则是观察到,在 def configure 函数的第 938-946行有如下代码:
def configure():
...
# append user defined flags after all our ones
for (confvar, envvar) in [['CCFLAGS', 'CCFLAGS_EXTRA'],
['CXXFLAGS', 'CXXFLAGS_EXTRA'],
['LINKFLAGS', 'LINKFLAGS_EXTRA'],
['LINKFLAGS', 'LDFLAGS_EXTRA']]:
if envvar in os.environ:
print("honghong",envvar,os.environ[envvar]);
value = shlex.split(os.environ[envvar])
conf.env.append_value(confvar, value)
...
很显然,其含义是把环境变量 “CXXFLAGS_EXTRA” 的内容也添加到 “CXXFLAGS” 这个变量下,作为当前的运行环境。因此更为优雅的方式是在执行 ./waf configure 之前(因为这一段代码是写在 def configure 下的,本质上就是 ./waf configure 时候运行的内容),先在 shell 中把环境变量 CXXFLAGS_EXTRA 的值赋值为 -Wno-error,即在 shell 中执行如下指令:
export CXXFLAGS_EXTRA="-Wno-error"
这样在 ./waf configure 生成的编译配置文件(build 目录下的内容)就不会包含 -Werror 选项了,因此也不会出现上述提到的错误。当然这种修改环境变量的方法当前终端关掉了该环境变量也就没了,如果希望设置永久环境变量则可以把该指令写入到 .bashrc 中,这里就不展开介绍了,可以自行百度:Linux 如何设置永久环境变量。