c++中,调用 c 语言函数时要对函数添加声明 extern "C"
,这是因为 c 和 c++的符号表机制不一样导致的。
假设存在函数 fun
,经过 gcc 编译后,该函数在符号表中的名字是 fun
,但是经过 g++
编译后,该函数在符号表中的结果是 xxfunxx
,c++编译器会在函数两侧加上一些随机字符。因为两者的编译结果不统一,所以混合使用的时候程序找不到符号,无法运行 (甚至都无法编译) 。一个典型的错误就是 (参考实际开发中出现的一个案例:一次 undefined reference to *的编译错记录):
1 2 3 |
/tmp/cccZeFer.o: In function `main': main.cpp:(.text+0xf): undefined reference to `add' collect2: error: ld returned 1 exit status |
而 extern "C"
语句的作用就是告诉 c++编译器:我这个是 c 语言函数,不要按照你的格式来修改这个函数的符号,按照我的标准来就行了。于是 c++编译器编译的时候就按照 c 的规范来,把两者符号统一。
示例
1 2 3 4 5 6 7 8 9 10 |
#include<stdio.h> int add(int i, int j) { return i + j; } int main() { printf("%d\n", add(1, 2)); return 0; } |
代码中有一个函数 add
,看看它经过 gcc 和 g++编译后分别变成了什么。
使用 gcc 编译:
使用 g++编译:
两者对比,很明显能看到,使用 g++编译后的 add 函数,符号表前后加上了一些特殊字符。而 gcc 编译出来的符号就是 add
本身。
给 add 函数加上 extern "C"
声明后:
1 2 3 4 5 6 7 8 9 10 11 |
#ifdef __cplusplus extern "C" { #endif int add(int i, int j) { return i + j; } #ifdef __cplusplus } #endif |
再次使用 g++编译,add 的符号就和 gcc 编译出来的符号一样了:
评论