gpt4 book ai didi

c++ - 与链接器无关的链接器错误

转载 作者:行者123 更新时间:2023-11-30 16:36:57 26 4
gpt4 key购买 nike

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

'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()'

为了本文的目的,错误输出被截断。错误和函数定义所在的对象会突出显示。

<小时/>

代码使用 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 Archiver 4 [arm-linux-gnueabihf]

使用 Gnu Make Builder。

<小时/>

源代码在文件夹中构建:

  • 源代码

    main.cpp

    • FPGA_外设

      • AUX_IMU

      header.h

      AUX_IMU_functions.c

<小时/>

产生错误的简约代码:

ma​​in.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++ Linker 4 [arm-linux-gnueabihf] 正确编译。

<小时/>

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

<小时/>

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

最佳答案

您的错误是由于 C++ 类型安全链接而发生的,它会破坏函数名称。您需要告诉 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 链接的函数的函数声明 block 。

您还可以在 C 中使用现有 header ,并在 C++ 代码中使用:

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

关于c++ - 与链接器无关的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com