链接错误与链接器无关。
链接错误与链接器无关。
我遇到了一个非常特殊的链接器错误:
'正在调用:GCC C++链接器4 [arm-linux-gnueabihf]'
arm-linux-gnueabihf-g++ -lpthread
./src/FPGA_Peripherals/AUX_IMU/AUX_IMU_functions.o
./src/main.o:在
函数main'中:
../src/main.cpp:7:
对`function()'的引用未定义
为了方便本文的目的,错误输出已被截断。错误和函数定义所在的目标文件已被突出显示。
代码使用DS-5 C/C++ Eclipse平台编译和链接,使用的是GCC 4.x [arm-linux-gnueabihd](DS-5内置)工具链:
- GCC C++编译器4 [arm-linux-gnueabihf]
- GCC C编译器4 [arm-linux-gnueabihf]
- GCC汇编器4 [arm-linux-gnueabihf]
- GCC C链接器4 [arm-linux-gnueabihf]
- GCC C++链接器4 [arm-linux-gnueabihf]
- GCC归档器4 [arm-linux-gnueabihf]
使用Gnu Make Builder。
源代码按文件夹结构组织:
- src
main.cpp
- FPGA_peripherals
- AUX_IMU
header.h
AUX_IMU_functions.c
- FPGA_peripherals
产生错误的最小化代码:
main.cpp
#include "header.h" int main() { function(); return 0; }
header.h
void function(void);
AUX_IMU_functions.c
#include "header.h" void function(void){ int i = 3; };
C代码使用GCC C编译器4 [arm-linux-gnueabihf]正确编译。
C++代码(其他文件,在此示例中未包含)使用GCC C++链接器4 [arm-linux-gnueabihf]正确编译。
这显然不是一个与链接器有关的问题,但如果链接器仍然产生这个错误,还有什么其他要检查的呢?
一旦我将文件重命名为.hpp和.cpp,错误就会消失。为什么会这样?是因为GCC C和GCC C++生成了不兼容的.o目标文件吗?
Linker error not related to Linker的问题出现的原因是由于C++的类型安全链接导致函数名被修饰。解决方法是告诉C++编译器function()
具有C链接:
extern "C" void function(void);
然而,如果同一个头文件要被C和C++编译器使用,通常可以通过以下方式实现:
#ifdef __cplusplus extern "C" #endif void function(void);
对于单个函数声明,或者使用以下方式:
#ifdef __cplusplus extern "C" { #endif void function(void); int response(int arg); … #ifdef __cplusplus } #endif
对于具有C链接的函数声明块。您还可以在C中使用现有的头文件,在C++代码中使用:
extern "C" { #include "header.h" }
非常感谢。我实际上尝试过在之前使用'extern "C" ',但是它会产生其他错误,因为GCC C编译器无法识别它。现在我明白为什么添加#ifdef _cplusplus是如此重要了。