***M68k-elf-gcc(for uclinux)真的支持C++吗?***
[复制链接]
我编译一个非常简单的c++程序:
exam.cpp:
class A
{
public:
A();
~A();
void func(); //virtual void func()
private:
int m_i;
};
A::A()
{
m_i = 0;
}
A::~A()
{}
void A::func()
{
++m_i;
}
int main()
{
return 0;
}
我的makefile文件如下:
CC = m68k-elf-gcc
LD = m68k-elf-gcc
LDFLAGS = -Os -elf2flt -m5307 -g -static
CFLAGS = -Os -Wall -m5307 -c -g -static
EXEC = exam
OBJECTS = exam.o
all: $(EXEC)
$(EXEC):$(OBJECTS)
$(LD) $(LDFLAGS) -o $@ $(OBJECTS) $(SYSLIBS)
exam.o:exam.cxx
$(CC) $(CFLAGS) $<
.PHONY : clean
clean:
-rm -f $(EXEC) *.elf *.o *.gdb
按照上面操作是没有问题,make后,编译通过且运行正常
但是只要作一个小小的改动马上就天下大乱了:
改动仅仅是在void func()的函数声明前加一个 virtual.
首先出的问题是-----编译错误:
exam.elf2flt:(.rodata._ZTI1A[typeinfo for A]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
collect2: ld returned 1 exit status
make: *** [exam] Error 1
解决办法是在makefile的连接命令中加入对libstdc++库的连接
$(LD) $(LDFLAGS) -o $@ $(OBJECTS) $(SYSLIBS) –lstdc++
编译还是错误:
ERROR: text=0x8820 overlaps data=0x0 ?
collect2: ld returned 1 exit status
make: *** [exam] Error 1
增加一个编译选项就可以了:
CFLAGS = -Os -Wall -m5307 -c -g -static -msep-data
编译àOK!
接着下到板子上面运行,马上就发生了错误:
$ exam
BINFMT_FLAT: reloc outside program 0x64656c (0 - 0xff641a94/0x8800), killing exa
m!
SIGSEGV
到了这一步的时候,无论我如何努力都没有办法既保证编译通过也保证运行正确了,我实在是没有办法了,我唯一能作的就是怀疑m68-elf-gcc对C++的支持程度!!!!!!
我真的希望我是某个地方弄错了,因为我必须依靠uclinux运行大型C++程序,请有经验的兄弟指点一下,非常感谢!!!!!!