此问题是在对OBS进行二次开发过程中遇到的,反正就是莫名其妙的就出现了,obs源码编译是在3个月前就编译好了的,最近需要添加新功能,再次编译过程就出现了此问题。

一开始我就觉得可能是VS环境的问题,但对vs开发环境的自信,就一直觉得是我添加的代码的问题,因此就一直执着于代码,解决过程中如下:

环境如下:

VS2017、WIN10、OBS开源代码

问题描述:

OBS编译过程中,源码中libobs 库的编译时,c++标准库cstdlib一直在报错noexcept,出现此错误:

 具体相关错误指向cstdlib的abs函数的问题,obs编译源文件如下(全是.c文件):

关键字noexcept作用: 

这是c++11新特性,此关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化。
如果在运行时,noexecpt函数向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出异常),程序会直接终止,调用std::terminate()函数,该函数内部会调用std::abort()终止程序。

网址:https://www.cnblogs.com/sword03/p/10020344.html

 

接下来,遇到自己没有遇见过的问题就开始百度以及一些开发群向大佬请教:

百度的解决方法就是:.c文件中添加了c++标准库的头文件,因此会出现此错误,解决方式就是把.c 修改为.cpp文件;

经常尝试发现能解决当前错误问题就会出现新的错误,如下

网上的解决问题方法就是取消重载函数、修改函数名称之类的常用方法,但是这个c++标准库的头文件,肯定是不能这样操作的,因此此方法是行不通的。

接下来我就去查找哪个文件里面调用了ctsdlib头文件,最终没有找到,我真的懵逼了(毕竟C++兼容C,并不是C兼容C++)。

于是我就重新cmake  obs源码,发现编译还是会出现这个问题(报错noexcept),一开始我是不想重新cmake的,因为cmake的obs源码编译后我添加了新的功能如果重新cmake就会修改很多代码,但为了解决问题以及验证vs,还是去cmake了,哈哈哈 结果还是存在问题。

接下来就是请教qq开发群大佬,尝试了一些修改编码格式等的方法最终还是不行,接下来就严重怀疑是我的vs出现问题了(决定此想法的前提是确定自己的代码没问题,代码的属性以及环境、sdk等都没有问题)。

整体花了一天时间去尝试和解决,也没有解决此问题,不知道vs是怎么导致出现此问题的,莫名其妙就出现的,于是我选择了卸载vs,重新安装vs,于是重新编译我的代码,就可以编译过了,不会出现此问题,添加自己的功能后,还是不会出现问题,成功编译。                             

我真的都不想说话了,我去你的。

 

 

但是我还是去验证一下正常情况下.c 改为.cpp文件的方法(语法错误: 标识符“noexcept”),编写简单的调用,验证如下:

说明此方法在对自己编写的代码中是可以行得通的,需要把.c改为.cpp文件,是可以解决的(自己编码过程中的错误调用)。

原因呢:我们都知道是C++兼容C,并不是C兼容C++;

 

以上就是解决此问题的思路,遇到问题就一步一步的来,多做笔记(容易忘记),易于后面遇到此类错误方便解决。

 

 

 

 

 

 

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐