从C调用C++函数遇未定义引用错误,求编译方法及问题排查
C调用C++函数出现"undefined reference"的问题解决
代码细节优化(非必改,但更规范)
你的print.cpp里重复写了extern "C",其实没必要——因为link.h已经通过__cplusplus宏,在C++编译器编译时自动给print()声明加上了extern "C"。可以修改为:
#include <iostream> #include "link.h" void print(){ std::cout << "hello from cpp" << std::endl; }
(加endl是为了让输出换行,避免终端提示符紧跟在输出后面)
核心问题:编译命令错误
你之前用的gcc -o test test.c link.h犯了三个关键错误:
- 头文件不需要作为编译参数传入,编译器会通过
#include自动解析 - 没有编译
print.cpp,导致链接阶段找不到print()的实现代码 - C代码依赖C标准库,仅用gcc链接会缺失相关依赖
正确的编译命令
方法1:分步编译+链接
- 编译C源文件为目标文件:
gcc -c test.c -o test.o
- 编译C++源文件为目标文件:
g++ -c print.cpp -o print.o
- 链接生成可执行文件(用g链接以自动引入C标准库):
g++ test.o print.o -o test
方法2:一次性编译所有源文件
直接用g处理所有文件,它会自动区分C/C代码并完成编译链接:
g++ test.c print.cpp -o test
原理说明
extern "C"的作用是禁用C的名字修饰机制,让C编译器生成和C语言兼容的函数符号,这样C代码调用时能匹配到正确的函数实现。但前提是你必须把C++源文件编译进程序,否则链接器找不到对应的函数实现,就会报"undefined reference"错误。
内容的提问来源于stack exchange,提问作者S P Krishna Phanindra
相关产品推荐
相关产品推荐

