链接器错误与链接器

时间:2018-01-13 10:37:35

标签: c++ c linker linker-errors

我有一个非常具体的链接器错误案例:

  

'调用:GCC C ++ Linker 4 [arm-linux-gnueabihf]'   arm-linux-gnueabihf-g ++ -lpthread   的 ./ SRC / FPGA_Peripherals / AUX_IMU / AUX_IMU_functions.o
  ./src/main.o:In   功能主要':   ../src/main.cpp:7:   对`function()'

的未定义引用

出于此帖子的目的,错误输出被截断。错误和函数定义所在的对象将突出显示。

使用DS-5 C / C ++ Eclipse Platform编译和链接代码,使用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 Linker 4 [arm-linux-gnueabihf]
  • GCC C ++ Linker 4 [arm-linux-gnueabihf]
  • GCC Archiver 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;
};

使用GCC C编译器4 [arm-linux-gnueabihf]正确编译C代码。 使用GCC C ++ Linker 4 [arm-linux-gnueabihf]正确编译C ++代码(其他文件,未包含在此示例中)。

这显然不是与链接器相关的问题,但如果链接器仍然产生此错误,还有什么要检查?

一旦我将文件重命名为.hpp和.cpp ,错误就会消失。这是为什么 ? GCC C和GCC C ++是否会产生不兼容的.o对象?

1 个答案:

答案 0 :(得分:0)

您的错误是由于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"
}