答案是使用extern C可解决C调用C库时的链接错误因其关闭C名字修饰使函数按C方式编译链接。1. C函数重载导致名字修饰C无此机制2. 链接时C查找修饰后符号名而C库为原始名致“undefined reference”3. extern C声明单个或多个函数禁用名字修饰4. 在C头文件中用#ifdef __cplusplus包裹兼容C/C编译5. C文件用gcc编译C文件用g编译最终用g链接。正确使用extern C和编译规则即可实现混合编程。在C项目中调用C语言编写的库函数时常会遇到链接错误比如“undefined reference to function”。这主要是因为C支持函数重载而C不支持因此C编译器会对函数名进行**名字修饰name mangling**而C编译器不会。为了解决这个问题需要使用 extern C 来告诉C编译器这部分函数应按照C语言的方式进行编译和链接。为什么需要 extern CC编译器为了支持重载会将函数名根据参数类型和数量进行例如当C代码试图调用一个由C编译生成的目标文件中的函数时如果没做特殊处理C会按修饰后的名字去查找但C库中只有原始函数名导致链接失败。如何使用 extern C使用 extern C 可以关闭C的名字修饰机制使函数按照C的规则进行链接。有两种常见用法1. 包裹单个函数声明extern C void c_function(int arg); extern C int add(int a, int b);2. 包裹多个函数常用在头文件中extern C { void c_init(); void c_process(); int c_get_status(); }这样在C源码中就能正确调用这些C函数了。在C头文件中兼容C和C编译器如果你写的是一个既可能被C使用也可能被C使用的C语言头文件可以使用宏判断来自动处理C函数速查手册CHM版C函数速查手册CHM版下载#ifndef MY_C_HEADER_H #define MY_C_HEADER_H #ifdef __cplusplus extern C { #endif void c_library_init(void); int c_compute_sum(int a, int b); #ifdef __cplusplus } #endif #endif // MY_C_HEADER_H__cplusplus 是C编译器定义的宏。当这个宏存在时说明当前是C环境需要加上 extern C。这样头文件既能被C包含也能被C安全引用。编译和链接注意事项确保C代码和C代码分别用对应的编译器编译示例命令gcc -c my_c_lib.c -o my_c_lib.o g -c main.cpp -o main.o g main.o my_c_lib.o -o program