我有一个非常具体的链接器错误案例:
'调用: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)工具链:
使用Gnu Make Builder。
源代码在文件夹中构建:
的src
的main.cpp
FPGA_peripherals
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对象?
答案 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"
}