C和C++混合编程引起的库文件函数无法解析有关问题?(较难)
C和C++混合编程引起的库文件函数无法解析问题?(较难)
首先是第三方提供了一个C++写的库AAA,有头文件而无源代码
接着我用Cpp文件进行了必要的封装,导出一系列funcAAA_XXXXXXX函数(第三方提供的函数接口)
接着根据项目的需要,我用C文件对funcAAA_XXXXXXX(第三方提供的函数接口)函数进行了封装,
形成一个静态库C_BBB.lib文件(我们用C封装第三方C++的库)
我也可以用Cpp文件对funcAAA_XXXXXXX函数进行了封装,形成一个静态库cpp_BBB.lib文件(我们用C++封装第三方C++的库)
C_BBB.lib文件CPP_BBB.lib文件都是导出funcBBBBBB_XXXXXXX(我们提供的函数接口)函数
问题在于:项目的另外一个团队需要我们这个库,而且他们必须用C写,
这样她调用我们C_BBB.lib文件(我们用C封装第三方C++的库)就会出出现无法链接funcAAA_XXXXXXX(第三方提供的函数接口)函数
如果用cpp_BBB.lib(我们用C++封装第三方C++的库)文件就会出出现无法链接funcBBBBBB_XXXXXXX(我们提供的函数接口)函数
------解决方案--------------------
多半是由于函数调用不一致,C编译器生成的函数名后边会加下划线或者X,具体的查查文献
解决办法:
在你封装的函数的前加上
extern "C"
调用的时候都用C调用,就好了
------解决方案--------------------
在你的封装类前加上
extern "C"
由于C++与C的编译风格的问题所以导致C无法调用C++编写的DLL
另外一种解决方案是使用DLL的序号进行Proc的调用
------解决方案--------------------
不行,不能只用C,要用C++
我用gcc编译一个项目的时候也遇到类似的问题
一定要用c++运行时库
------解决方案--------------------
既然静态库又要满足c,又要满足cpp的调用
一般,对于c肯定是封装成函数
cpp肯定是封装成类,比如一个只有函数没有对象的方法类
这样,对于导出的c函数,extern,对于导出类,自然没必要做任何处理
也不用搞2个lib,只要1个lib即可
这样,cpp直接使用导出类,c直接使用导出函数
这样不是异常完美么
------解决方案--------------------
要求得分!
首先是第三方提供了一个C++写的库AAA,有头文件而无源代码
接着我用Cpp文件进行了必要的封装,导出一系列funcAAA_XXXXXXX函数(第三方提供的函数接口)
接着根据项目的需要,我用C文件对funcAAA_XXXXXXX(第三方提供的函数接口)函数进行了封装,
形成一个静态库C_BBB.lib文件(我们用C封装第三方C++的库)
我也可以用Cpp文件对funcAAA_XXXXXXX函数进行了封装,形成一个静态库cpp_BBB.lib文件(我们用C++封装第三方C++的库)
C_BBB.lib文件CPP_BBB.lib文件都是导出funcBBBBBB_XXXXXXX(我们提供的函数接口)函数
问题在于:项目的另外一个团队需要我们这个库,而且他们必须用C写,
这样她调用我们C_BBB.lib文件(我们用C封装第三方C++的库)就会出出现无法链接funcAAA_XXXXXXX(第三方提供的函数接口)函数
如果用cpp_BBB.lib(我们用C++封装第三方C++的库)文件就会出出现无法链接funcBBBBBB_XXXXXXX(我们提供的函数接口)函数
------解决方案--------------------
多半是由于函数调用不一致,C编译器生成的函数名后边会加下划线或者X,具体的查查文献
解决办法:
在你封装的函数的前加上
extern "C"
调用的时候都用C调用,就好了
------解决方案--------------------
在你的封装类前加上
extern "C"
由于C++与C的编译风格的问题所以导致C无法调用C++编写的DLL
另外一种解决方案是使用DLL的序号进行Proc的调用
------解决方案--------------------
不行,不能只用C,要用C++
我用gcc编译一个项目的时候也遇到类似的问题
一定要用c++运行时库
------解决方案--------------------
既然静态库又要满足c,又要满足cpp的调用
一般,对于c肯定是封装成函数
cpp肯定是封装成类,比如一个只有函数没有对象的方法类
这样,对于导出的c函数,extern,对于导出类,自然没必要做任何处理
也不用搞2个lib,只要1个lib即可
这样,cpp直接使用导出类,c直接使用导出函数
这样不是异常完美么
------解决方案--------------------
要求得分!