关于混合编程的问题#Linux##Opencv#

问题遇到的现象和发生背景

基于Linux系统操作,目前有个C语言的项目,编译的时候使用gcc。想添加opencv处理功能,单元测试用的g++。提出下列问题:
1.opencv高版本功能是用C++写的,C语言调用opencv有没有需要注意的?是否需要做混合编程相关工作?
2.选用G++同时编译 .c 和 .cpp文件,是将 .c 文件视为还是c源还是cpp源?

问题1参考了 https://blog.51cto.com/xiamachao/2733846 ——C语言如何调用C++库
https://blog.csdn.net/qq_33195791/article/details/100584342 ——Makefile C与C++混编的简单写法

问题相关代码,请勿粘贴截图

img

img

运行结果及报错内容

显然,使用 gcc 是可以编译.cpp文件的
但是使用gcc混合编译.c和.cpp会有链接错误,这时使用问题里的链接应该是可以解决的。

我的解答思路和尝试过的方法

后来我尝试了使用 g++混合编译.c和.cpp,通过了!!!这是为何?这是否意味着我可以直接使用g++去混合编译而不需要分开编译?

想要的结果

是否可以直接在.c文件里调用opencv,然后用g++编译链接而不遇到问题?

gcc -lstdc++ -o test test.cpp 可以编译一些带stl的cpp文件,但是c++有些特殊语法,例如for循环里面定义自增量就无法使用前面的编译过去,只能用g++来。g++将.c视为cpp编译的。

linux用的少,windows用的多,不过可以提供一个思路给你。
好像直接用extern "C" 修饰的函数名,然后在c文件中用extern 声明改函数,应该也可以直接被c调用,简单的应该是可以的,像opencv会不会遇到问题我也不知道,你可以试一试,这种方法估计也要用g++来编译。
另外一种方法就是将opencv代码打包成动态链接库,然后在dll导出的时候加上 extern "C" 告诉编译器编译时使用C方式的函数命名规则,这样你的dll就可以被c调用。以上是win下导出dll,linux下面导出.so应该也是同样的道理,这样你可以将cpp的代码和c分开,直接用c调用cpp的动态库达到混合编程的目的。