本帖最后由 Spirit\ 于 2014-12-12 21:25 编辑
本人新手,在WINDOWS下编程已经习惯C++的概念,尝试基于ARM的编程过程中遇到问题。
同样的C++代码,全部放在一个CPP文件里编译链接都没有问题,但分成两个CPP文件后链接时报错。提示信息如下:
arm-linux-g++ -o led.o led.cpp -c
arm-linux-g++ -o main.o main.cpp -c
arm-linux-ld -Ttext 0x0 -o led_icache.elf start.o led.o main.o
main.o: In function `main':
main.cpp: (.text+0x140): undefined reference to `__cxa_end_cleanup'
main.cpp: (.text+0x168): undefined reference to `__cxa_end_cleanup'
main.o: (.ARM.extab+0x0): undefined reference to `__gxx_personality_v0'
main.o: (.eh_frame+0x43): undefined reference to `__gxx_personality_v0'
make: *** [led_icache.bin] 错误 1
下面列出相关代码,一个头文件,两个CPP文件,一个MAKEFILE
led.h:
class LED
{
public:
LED(int port);
~LED();
void On();
void Off();
private:
int mPort;
};
led.cpp:
#include "led.h"
#define GPJ2CON (*(volatile unsigned long *) 0xE0200280)
#define GPJ2DAT (*(volatile unsigned long *) 0xE0200284)
LED:: LED(int port)
{
mPort = port;
GPJ2CON |= (1 << (mPort * 4));// ÅäÖÃÒýœÅ
}
LED::~LED()
{};
void LED::On()
{
GPJ2DAT &= ~(1<<mPort);
}
void LED::Off()
{
GPJ2DAT |= (1<<mPort);
}
maiin.cpp:
#include "led.h"
void delay(unsigned long count)
{
volatile unsigned long i = count;
while (i--);
}
int main()
{
LED led[4] = {LED(0),LED(1),LED(2),LED(3)};
int i=3;
while(1)
{
led.Off();
i++;
i=i%4;
led.On();
delay(0x1000000);
}
return 0;
}
makefile:
led_icache.bin: start.o led.o main.o
arm-linux-ld -Ttext 0x0 -o led_icache.elf $^
arm-linux-objcopy -O binary led_icache.elf led_icache.bin
arm-linux-objdump -D led_icache.elf > led_icache_elf.dis
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.cpp
arm-linux-g++ -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkmini210 -f
如果我把led.h和led.cpp中的内容全部复制到main.cpp文件中则没有任何问题。生成的BIN文件700多字节
后来尝试把makefile中的ld命令中加入参数“-lstdc++”,然后再次编译链接成功。但是,生成的BIN文件36K,大了许多。猜测链接过程中将stdc++库也加入了其中。所以觉得加这个参数应该不是正确的解决方法。
以上,请各位前辈多多赐教!
|