链接错误与链接器无关。

9 浏览
0 Comments

链接错误与链接器无关。

我遇到了一个非常特殊的链接器错误:

'正在调用: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


产生错误的最小化代码:

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目标文件吗?

0
0 Comments

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是如此重要了。

0