如何在C++文件中正确引用并使用外部C文件定义的函数?
解决C++调用外部C函数的链接错误问题
你的代码已经通过头文件的extern "C"处理了C/C混合编程的名字修饰问题,但出现的是链接错误——链接器找不到doubleFunct的实现代码,因为你只编译了C文件,没把C文件的编译结果包含进来。
步骤1:简化代码(可选但更规范)
basic.cc里无需重复用extern "C"包裹头文件,因为c_file.h已经通过__cplusplus宏判断,自动为C++编译器添加extern "C"声明。修改后的basic.cc如下:
#include <iostream> #include "c_file.h" int main(int argc, char* argv[]) { int di = doubleFunct(2); std::cout << "di: " << di << std::endl; return 0; }
步骤2:正确编译链接
有两种方式完成编译:
- 分步编译:
- 先编译C文件生成目标文件:
gcc -c src/c_file.c -o src/c_file.o - 再编译C++文件并链接C的目标文件:
g++ src/basic.cc src/c_file.o -o basic -std=c++17
- 先编译C文件生成目标文件:
- 一步编译(直接同时编译两个源文件):
g++ src/basic.cc src/c_file.c -o basic -std=c++17
关键原因说明
c_file.h中的extern "C"块是核心:它告诉C编译器,块内的函数要以C语言的名字修饰规则生成符号,避免C因函数重载机制产生的名字扭曲,保证C编译出的函数符号和C++调用的符号一致。- 链接错误的本质是你只编译了
basic.cc,没有把c_file.c的代码纳入编译流程,链接器找不到doubleFunct的实现体。
内容的提问来源于stack exchange,提问作者Raphael10
相关产品推荐
相关产品推荐

