与链接器无关的链接器错误

Linker error not related to Linker

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

'Invoking: 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 function main': ../src/main.cpp:7: undefined reference to `function()'

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


代码是使用 DS-5 C/C++ Eclipse 平台和 GCC 4.x [arm-linux-gnueabihd] 编译和链接的(DS-5 内置-在)工具链:

使用 Gnu Make Builder。


源代码在文件夹中构建:


产生错误的简约代码:

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 代码。 C++ 代码(其他文件,未包含在此示例中)使用 GCC C++ 链接器 4 [arm-linux-gnueabihf] 正确编译。


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


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

您的错误是由于 C++ type-safe 链接造成的,它破坏了函数名称。您需要告诉 C++ 编译器 function() 具有 C 链接:

extern "C" void function(void);

但是,如果 C 和 C++ 编译器都应使用相同的 header,您通常可以使用

#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 中使用现有的 header,在 C++ 代码中,使用:

extern "C" {
#include "header.h"
}