C++调C库
main.cpp
#include "fun.h"
int main()
{
fun();
}
fun.h
void fun();
fun.c
#include <stdio.h>
#include "fun.h"
void fun()
{
printf("hello world!\n");
}
编译
1.直接g++编译cpp 和 c文件
2.将c文件做成动态库然后动态链接
为何编译不过?
因为C++与C编译不同,C++支持函数重载,所以原来的 fun 在编译时可能会加前缀。C编译后函数名不会变化。所以c++直接使用 c 库的头文件编译会找不到符号。 nm 时names的缩写。可以自己学习
那么我今天就想用C库改怎么办呢?
这时候 extern “C” 就登场了。他会告诉编译器,编译此处的时候要用C的编译方式来编译。
直接用C库头文件编译不可得,后来直接修改头文件而不重新编译C库也好用。但是不可取。正常情况应在编译动态库时使用 extern C。
改良版 fun.h
#ifdef __cplusplus
extern "C"{
#endif
void fun();
#ifdef __cplusplus
}
#endif
C 调用C++ 库
函数名在编译时 C 和C++不同 C要用C++,函数名的问题解决起来很麻烦。遂不研究
番外
nm 可以查看符号信息,但是实际工作中项目发布给客户时并不需要带此信息。因此为了节省存储空间都会对项目瘦身。操作如下:
#include <stdio.h>
void fun()
{
printf("hello woeld\n");
}
int main()
{
fun();
}