Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > проблемы с линковкой


Автор: sunnmas 17.4.2009, 09:37
Возникла проблема. Нашел на другом форуме точную формулировку своей проблемы. Решение той проблемы не описано. Прошу помочь:

Цитата

Hi All,
I've built the arm-elf tool chain with the following
gcc 3.0.2 release
binutil 2.11.92.0.7
newlib-1.9.0

When I build the following C++ program I get undefined reference to
_gxx_personality_sj0

file t.hpp
    

Код

class foo
{
public:
foo(void);
~foo(void);
void test(void);
}



file t.cpp


Код

#include "t.hpp"
foo::foo(void)
{;}
foo::~foo(void)
{;}
void foo::test(void)
{;}



file tt.cpp

    
Код


#include "t.hpp"
int main(void)
{
foo k;
while(1)
    k.test();
}



If all the files listed are place in the same source file I don't get the
undefined reference to _gxx_personality_sj0.
Any suggestions?



мой маке файл:

Код

TRGT = arm-elf-
CPP = $(TRGT)g++
CC = $(TRGT)gcc
LD = $(TRGT)ld
AS = $(TRGT)as
OC = $(TRGT)objcopy
SZ = $(TRGT)size

MCU = arm7tdmi
PROJECT = mit

LDSCRIPT = AT91SAM7S64-ROM.ld
source_dirs = source
out_dir = out

#флаги g++
CPPFLAGS = -c -fexpensive-optimizations -O3
#флаги gcc
CCFLAGS = -c -MD -O0
#флаги as
ASFLAGS = -Wa -amhls=$(out_dir)/$(notdir $(<:.s=.lst)) -ahls -mapcs-32
#флаги ld
LDFLAGS = -Wl,-T$(LDSCRIPT),-Map=$(out_dir)/$(PROJECT).map,--cref,-lstdc++,-lsupc++
LDFLAGS2= -mcpu=$(MCU) -nostartfiles -T$(LDSCRIPT) -Wl,--no-warn-mismatch

#флаги objcopy
OCFLAGS = --output-target=binary


search_wildcards := $(addsuffix /*.s,$(source_dirs)) $(addsuffix /*.cpp,$(source_dirs)) $(addsuffix /*.c,$(source_dirs))
VPATH := $(source_dirs)
OBJECTS = $(addprefix $(out_dir)/, $(notdir $(patsubst %.c,%.o, $(patsubst %.cpp,%.o, $(patsubst %.s,%.o, $(wildcard $(search_wildcards)))))))


all: clean binutilsversions $(PROJECT) $(out_dir)/$(PROJECT).elf size

.PHONY: clean

clean:
rm -f $(addprefix $(out_dir)/, *.d *.o *.lst *.map *.out *.bin)

binutilsversions:
@echo ================================================== =================
@$(CPP) --version
@echo ================================================== =================
@$(CC) --version
@echo ================================================== =================
@$(AS) --version
@echo ================================================== =================
@$(LD) --version
@echo ================================================== =================
@echo

$(out_dir)/$(PROJECT).elf: $(OBJECTS)
$(CC) $(OBJECTS) $(LDFLAGS2) -o $@

$(PROJECT): $(out_dir)/$(PROJECT).out
$(OC) $(OCFLAGS) $< $(out_dir)/$(PROJECT).bin

#линковка
$(out_dir)/$(PROJECT).out: $(OBJECTS)
$(CC) $(LDFLAGS) $^ -o $@
#$(LD) $(LDFLAGS) $^ -o $@

#компиляция
$(addprefix $(out_dir)/,%.o): %.c
$(CC) $(CCFLAGS) $< -o $@

$(addprefix $(out_dir)/,%.o): %.cpp
$(CPP) $(CPPFLAGS) $< -o $@

#асемблирование
$(addprefix $(out_dir)/,%.o): %.s
$(AS) $(ASFLAGS) $< -o $@

size: $(out_dir)/$(PROJECT).out
$(SZ) $<

include $(wildcard *.d)

Автор: ilyuha 17.4.2009, 10:08
; в хидере после объявление класса поставте

Автор: xvr 17.4.2009, 11:30
Плюсовые программы надо линковать плюсовым компилятором
В Makefile'е в строке 55 замените $(CC) на $(CPP)
(и в остальных местах, где это используется)

Автор: sunnmas 17.4.2009, 12:06
Цитата

Плюсовые программы надо линковать плюсовым компилятором
В Makefile'е в строке 55 замените $(CC) на $(CPP)
(и в остальных местах, где это используется)


Помогло. Спасибо огромное

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)