2011-06-26 9 views
11

Podczas tworzenia projektu w AVR Studio 5, tworzy plik .c o następującej treści:AVR Studio 5: kompilacji kodu C++

#include <avr/io.h> 

int main(void) 
{ 
    while(1) 
    { 
     //TODO:: Please write your application code 
    } 
} 

budowania programu C działa dobrze:

------ Rebuild All started: Project: AVRGCC2, Configuration: Debug AVR ------ 
Build started. 
Project "AVRGCC2.avrgccproj" (ReBuild target(s)): 
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). 
Target "CoreRebuild" in file "C:\Programme\Atmel\AVR Studio 5.0\Vs\AvrGCC.targets" from project "C:\Dokumente und Einstellungen\tom\Eigene Dateien\AVRStudio\test\AVRGCC2\AVRGCC2\AVRGCC2.avrgccproj" (target "ReBuild" depends on it): 
    Task "RunAvrGCC" 
     C:\Programme\Atmel\AVR Studio 5.0\AVR ToolChain\bin\make.exe clean all 
     rm -rf AVRGCC2.o AVRGCC2.d libAVRGCC2.a AVRGCC2.hex AVRGCC2.eep AVRGCC2.lss AVRGCC2.map 
AVRGCC2.c 
     Invoking: AVR/GNU C Compiler 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-gcc.exe" -funsigned-char -funsigned-bitfields -O0 -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -mmcu=atmega328p -MD -MP -MF"AVRGCC2.d" -MT"AVRGCC2.d" -o"AVRGCC2.o" ".././AVRGCC2.c" 
     Finished building: .././AVRGCC2.c 
     Building target: AVRGCC2.elf 
     Invoking: AVR/GNU C/C++ Linker 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-gcc.exe" -mmcu=atmega328p -Wl,-Map=AVRGCC2.map -o AVRGCC2.elf AVRGCC2.o 
     Finished building target: AVRGCC2.elf 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature "AVRGCC2.elf" "AVRGCC2.hex" 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objdump.exe" -h -S "AVRGCC2.elf" > "AVRGCC2.lss" 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "AVRGCC2.elf" "AVRGCC2.eep" || exit 0 
     AVR Memory Usage 
     ---------------- 
     Device: atmega328p 
     Program:  142 bytes (0.4% Full) 
     (.text + .data + .bootloader) 
     Data:   0 bytes (0.0% Full) 
     (.data + .bss + .noinit) 
    Done executing task "RunAvrGCC". 
Done building target "CoreRebuild" in project "AVRGCC2.avrgccproj". 
Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != ''). 
Target "ReBuild" in file "C:\Programme\Atmel\AVR Studio 5.0\Vs\Avr.common.targets" from project "C:\Dokumente und Einstellungen\tom\Eigene Dateien\AVRStudio\test\AVRGCC2\AVRGCC2\AVRGCC2.avrgccproj" (entry point): 
Done building target "ReBuild" in project "AVRGCC2.avrgccproj". 
Done building project "AVRGCC2.avrgccproj". 

Build succeeded. 
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ========== 

Ale gdy zmienię rozszerzenie pliku na .cpp, kompilacja wyda ostrzeżenie typ urządzenia nie zdefiniowany (który zmieni się w błąd, jeśli próbuje użyć dowolnego rejestru określonego AVR):

------ Rebuild All started: Project: AVRGCC2, Configuration: Debug AVR ------ 
Build started. 
Project "AVRGCC2.avrgccproj" (ReBuild target(s)): 
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). 
Target "CoreRebuild" in file "C:\Programme\Atmel\AVR Studio 5.0\Vs\AvrGCC.targets" from project "C:\Dokumente und Einstellungen\tom\Eigene Dateien\AVRStudio\test\AVRGCC2\AVRGCC2\AVRGCC2.avrgccproj" (target "ReBuild" depends on it): 
    Task "RunAvrGCC" 
     C:\Programme\Atmel\AVR Studio 5.0\AVR ToolChain\bin\make.exe clean all 
     In file included from .././AVRGCC2.cpp:1:0: 
c:\programme\atmel\avr studio 5.0\avr toolchain\bin\../lib/gcc/avr/4.5.1/../../../../avr/include/avr/io.h(446,6): #warning "device type not defined" 
     rm -rf AVRGCC2.o AVRGCC2.d libAVRGCC2.a AVRGCC2.hex AVRGCC2.eep AVRGCC2.lss AVRGCC2.map 
AVRGCC2.cpp 
     Invoking: AVR/GNU CPP Compiler 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-g++.exe" -MD -MP -MF"AVRGCC2.d" -MT"AVRGCC2.d" -o"AVRGCC2.o" ".././AVRGCC2.cpp" 
     Finished building: .././AVRGCC2.cpp 
     Building target: AVRGCC2.elf 
     Invoking: AVR/GNU C/C++ Linker 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-gcc.exe" -mmcu=atmega328p -Wl,-Map=AVRGCC2.map -o AVRGCC2.elf AVRGCC2.o 
     Finished building target: AVRGCC2.elf 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature "AVRGCC2.elf" "AVRGCC2.hex" 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objdump.exe" -h -S "AVRGCC2.elf" > "AVRGCC2.lss" 
     "C:/Programme/Atmel/AVR Studio 5.0/AVR ToolChain/bin/avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "AVRGCC2.elf" "AVRGCC2.eep" || exit 0 
     AVR Memory Usage 
     ---------------- 
     Device: atmega328p 
     Program:  142 bytes (0.4% Full) 
     (.text + .data + .bootloader) 
     Data:   0 bytes (0.0% Full) 
     (.data + .bss + .noinit) 
    Done executing task "RunAvrGCC". 
Done building target "CoreRebuild" in project "AVRGCC2.avrgccproj". 
Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != ''). 
Target "ReBuild" in file "C:\Programme\Atmel\AVR Studio 5.0\Vs\Avr.common.targets" from project "C:\Dokumente und Einstellungen\tom\Eigene Dateien\AVRStudio\test\AVRGCC2\AVRGCC2\AVRGCC2.avrgccproj" (entry point): 
Done building target "ReBuild" in project "AVRGCC2.avrgccproj". 
Done building project "AVRGCC2.avrgccproj". 

Build succeeded. 
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ========== 

Porównanie obu wyjść pokazuje, że dla kodu C dodaje on opcję -mmcu=atmega328p do avr-gcc.exe, ale dla kodu C++ nie jest wykonywana przy wykonywaniu avr-g++.exe. Podobny problem mam przy korzystaniu z WinAVR. Jak rozwiązać ten problem?

+1

Znalazłem jedno obejście: zmień nazwę wszystkich plików .cpp na .c i zdefiniuj następujące opcje kompilatora: '-x C++ -std = gnu ++ 98'. – Mot

+0

Czy możesz dodać komentarz jako odpowiedź i zaakceptować? W ten sposób pytanie przestanie pojawiać się jako bez odpowiedzi. –

Odpowiedz

7

Znalazłem jedno obejście: zmień nazwę wszystkich plików .cpp na .c i określ następujące opcje kompilatora: -x c++ -std=gnu++98.

0

Czy próbowałeś otworzyć okno dialogowe projektu i sprawdzić, czy ustawiony jest devicetype?

+0

Oczywiście, inaczej nie działałby z wariantem C. – Mot

5

Zdaję sobie sprawę, że jest to dodatek późno, ale w przypadku ktokolwiek inny natyka się na to:

Czy zauważyliście, że istnieje C++ rozszerzenie dostępne dla AVR Studio 5 w Narzędzia -> Extension Manager? Pozwala to tworzyć projekty C++ z rozszerzeniami .cpp i wszystkim. Source

Powiązane problemy