2011-06-26 23 views
11

Khi tạo một dự án trong AVR Studio 5, nó tạo ra một tập tin .c với nội dung sau:AVR Studio 5: biên dịch C++

#include <avr/io.h> 

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

Xây dựng chương trình C này chỉ hoạt động tốt:

------ 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 ========== 

Nhưng khi tôi thay đổi phần mở rộng của tệp thành .cpp, bản dựng sẽ phát ra cảnh báo loại thiết bị không được xác định (sẽ biến thành lỗi nếu cố sử dụng bất kỳ đăng ký cụ thể AVR nào):

------ 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 ========== 

So sánh cả hai kết quả đầu ra cho thấy rằng đối với mã C, nó thêm tùy chọn -mmcu=atmega328p đến avr-gcc.exe nhưng đối với mã C++ thì không khi thực hiện avr-g++.exe. Vấn đề tương tự như tôi có khi sử dụng WinAVR. Làm thế nào để giải quyết điều này?

+1

Tôi đã tìm thấy một giải pháp thay thế: đổi tên tất cả các tệp .cpp thành .c và xác định các tùy chọn trình biên dịch sau: '-x C++ -std = gnu ++ 98'. – Mot

+0

Bạn có thể viết bình luận của mình làm câu trả lời và chấp nhận nó không? Bằng cách đó, câu hỏi sẽ ngừng hiển thị như chưa được trả lời. –

Trả lời

7

Tôi đã tìm thấy một giải pháp thay thế: đổi tên tất cả .cpp tệp thành .c và xác định các tùy chọn trình biên dịch sau: -x c++ -std=gnu++98.

0

Bạn đã thử mở hộp thoại dự án và kiểm tra xem devicetype đã được đặt chưa?

+0

Chắc chắn, nếu không nó sẽ không làm việc với biến thể C. – Mot

5

Tôi nhận ra đây là một bổ sung muộn, nhưng trong trường hợp tình cờ bất cứ ai khác trên này:

Bạn có nhận thấy rằng có một ++ mở rộng C có sẵn cho AVR Studio 5 dưới Tools -> Extension Manager? Điều này cho phép bạn tạo các dự án C++ với phần mở rộng .cpp và mọi thứ. Source

Các vấn đề liên quan