Embedded 目标*.elf的AtmelStudio配方失败
我已将代码分成文件(*.c和*.h)并将其包括在内。我有guard头文件,所有分离的文件都报告正在生成:Embedded 目标*.elf的AtmelStudio配方失败,embedded,avr,atmelstudio,Embedded,Avr,Atmelstudio,我已将代码分成文件(*.c和*.h)并将其包括在内。我有guard头文件,所有分离的文件都报告正在生成: Finished building: .././test.c 但我的项目生成导致以下错误: recipe for target 'Midi.elf' failed ,因为 undefined reference to 'some_test()' (对函数的所有调用)在这些分离的文件中定义。 我不知道如何调试这个。我插入了编译器警告,可以证明要处理的函数定义和声明。可能无法链接avr-g
Finished building: .././test.c
但我的项目生成导致以下错误:
recipe for target 'Midi.elf' failed
,因为
undefined reference to 'some_test()'
(对函数的所有调用)在这些分离的文件中定义。
我不知道如何调试这个。我插入了编译器警告,可以证明要处理的函数定义和声明。可能无法链接avr-g++.exe和avr-gcc.exe生成输出
Sketch.cpp:
#include "test.h"
void setup() {
some_test();
}
void loop() {
}
测试h:
#ifndef TEST_H
#define TEST_H
void some_test(void);
#warning "processing test.h"
#endif //TEST_H
测试c:
#include "test.h"
void some_test(void){
#warning "processing test.c"
}
输出(项目相关部分):
素描.CPP编译为C++,包括测试h。为了支持函数重载、类成员等,C++使用名称的Frimple来编码这些C++特征在符号名中的代码。因此,Sketch.cpp中的
some_test
的符号名称与test.c中的符号名称不同,test.c编译为c,不使用名称mabling
解决方案是,通过指定符号具有C连接:
,当头是C++编译时,防止这个符号的名称窜改。#ifndef TEST_H
#define TEST_H
#if defined __cplusplus
extern "C"
{
#warning Using C linkage in C++ for test.h
#endif
void some_test(void);
#warning "processing test.h"
#if defined __cplusplus
}
#endif
#endif //TEST_H
extern“C”
声明中的大括号({…}
)表示所有封闭的符号声明都有C链接。对于C/C++互操作性,所有的C代码头都应该包含这个包装器。
当然,另一个解决方案是简单地将Cest.c编译为C++(最简单的是重命名它.TCP.CPP)。注意,ARDIIO草图代码和库是C++代码。通常最好坚持C++编译,以允许访问具有C++链接的ARDUNO库,并需要大量包装代码从C.</P>访问。
不可帮助地,当使用C++编译时,生成日志声明“<代码>调用:AVR8/GNUC编译器”。我认为这只是Atmel Studio的一部分,不是由编译器本身生成的
#ifndef TEST_H
#define TEST_H
#if defined __cplusplus
extern "C"
{
#warning Using C linkage in C++ for test.h
#endif
void some_test(void);
#warning "processing test.h"
#if defined __cplusplus
}
#endif
#endif //TEST_H