与链接器无关的链接器错误
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 内置-在)工具链:
- 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;
};
使用 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"
}
我有一个非常具体的链接器错误案例:
'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 内置-在)工具链:
- 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;
};
使用 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"
}