You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:正确编译链接

有两种方式完成编译:

  • 分步编译:
    1. 先编译C文件生成目标文件:
      gcc -c src/c_file.c -o src/c_file.o
      
    2. 再编译C++文件并链接C的目标文件:
      g++ src/basic.cc src/c_file.o -o basic -std=c++17
      
  • 一步编译(直接同时编译两个源文件):
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:47:11