在嵌入式开发过程中经常使用ARM GCC编译器,常常会遇到C++初始化问题。在ARM GCC默认的链接脚本中是没有考虑C++对象初始化的情况的,因此我们需要手动修改链接脚本以解决这个问题。
下面是一个简单的示例:
我们有一个包含全局C++对象的CPP文件 test.cpp:
#include "TestClass.h"
TestClass obj;
我们再有一个main函数 main.cpp:
#include "TestClass.h"
int main(void) {
obj.func();
}
其中TestClass类定义在TestClass.h中,并且有一个public函数func()。
如果我们直接使用gcc编译器编译这两个文件,链接器会因为找不到TestClass obj而报错。
解决方法是,我们需要手动修改链接脚本,告诉链接器如何处理C++对象初始化。具体步骤如下:
SECTIONS {
.init_array : {
KEEP(*(SORT(.init_array.*)))
}
}
LDSCRIPT = path/to/link.ld
arm-none-eabi-g++ -c test.cpp -o test.o
arm-none-eabi-g++ -c main.cpp -o main.o
arm-none-eabi-g++ -T $(LDSCRIPT) test.o main.o -o out.elf
通过以上步骤,我们就成功地解决了C++对象初始化的问题。