Embedded 目标*.elf的AtmelStudio配方失败

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

我已将代码分成文件(*.c和*.h)并将其包括在内。我有guard头文件,所有分离的文件都报告正在生成:

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