【发布时间】:2018-06-22 16:06:28
【问题描述】:
我有一个非常具体的链接器错误案例:
'调用:GCC C++ 链接器 4 [arm-linux-gnueabihf]' arm-linux-gnueabihf-g++ -lpthread ./src/FPGA_Peripherals/AUX_IMU/AUX_IMU_functions.o
的引用
./src/main.o:在 功能主要': ../src/main.cpp:7: 未定义对 `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 归档程序 4 [arm-linux-gnueabihf]
使用 Gnu Make Builder。
源代码结构在文件夹中:
-
src
main.cpp
-
FPGA_外设
- 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 Compiler 4 [arm-linux-gnueabihf] 正确编译了 C 代码。 使用 GCC C++ Linker 4 [arm-linux-gnueabihf] 正确编译了 C++ 代码(本示例中未包含的其他文件)。
这显然不是与链接器相关的问题,但是如果链接器仍然产生此错误,还要检查什么?
一旦我将文件重命名为 .hpp 和 .cpp,错误就会消失。这是为什么 ? GCC C 和 GCC C++ 会产生不兼容的 .o 对象吗?
【问题讨论】:
-
请注意,
void function(void){ int i = 3; };中的最后一个分号是多余的。几乎,但不是完全无害;在严格的编译器选项下,您会收到有关空的全局声明的警告,这可能会让您感到困惑。初始化器和类型需要在右大括号后加分号;函数没有。 -
您的错误是因为 C++ 类型安全链接破坏了函数名称。您需要告诉 C++ 编译器
function()具有 C 链接:extern "C" void function(void);。你通常在函数声明之前使用#ifdef __cplusplus/extern "C"/#endif,或者在C函数声明块之前有条件地使用extern "C" {和}。 -
@JonathanLeffler 好吧,这是违反约束,所以允许编译失败。
标签: c++ c linker linker-errors