4

我知道关于这个主题有很多问题,我已经浏览了其中的相当多的问题。但是我仍然遇到问题。

我开始为原型 PCB 编写测试程序,现在它已经增长到近 1000 行,我正试图将其分解为可用于特定功能的库。

我认为这将非常简单。为我需要的每个库制作 .c 和 .h 文件。即,对于控制 OLED 显示器的功能,我将使用 OLED.h 和 OLED.c。将适当的函数/定义复制到每个文件中。然后将这些文件复制到 Atmel Studio 中的解决方案中。我将它们放入项目名称下的 src 文件夹中。

但是,这不起作用!我得到一个非常长的错误列表。就编译器而言,.h 文件中定义的所有内容显然都是未定义的。我还收到许多类型为“未知类型名称 int16_t/uint16_t/uint8_t/etc...”的错误消息,这让我很困惑。为什么函数在外部库中很重要,现在编译器不理解这些数据类型的含义?

所以,这可能是一个愚蠢的问题。我不希望 Atmel Studio 通过将它们包装在一些“库项目”或其他东西中来控制我的库,我想将它们放在我选择的文件夹中,并在需要时添加它们。我已经搜索了这个问题的答案,我找到了关于更改项目的编译器设置、链接器设置等的长教程......我尝试了这个教程,但仍然没有骰子:http ://www.engblaze.com/教程-使用-avr-studio-5-with-arduino-projects/#setup

我也找不到通过右键单击项目并单击“添加”来添加内容的方法。它要我找到 .a 文件。Atmel Studio 中的“添加库”对话框看起来很糟糕。

当然,将库添加到现有项目并使其正常运行不会那么复杂吗?!我过去使用过 PIC,来到 Atmel 时,我发现了可怕的文档和一个奇怪的超级光滑的超级飞翔的 whiz bang 界面,它不能很好地单独留下并且混淆了简单的功能。我可以做些什么来添加这些库?

更新:似乎回答了我自己的问题。结果我需要将所有的库都包含在 .c 文件中以识别数据类型和诸如此类的东西。我不知何故认为这只需要在主文件中完成,但显然我错了。添加 asf.h 似乎效果很好,因为它包含所有 MCU 特定的端口定义/名称以及所有这些。现在一切都好!

4

2 回答 2

3

将库文件添加到解决方案应该很简单。转到解决方案资源管理器,右键单击您的解决方案,然后转到“添加->现有项目”。如果要添加预先存在的库并将其保存在与解决方案不同的文件夹中,请单击“添加”旁边的箭头并选择“添加为链接”。由于在您的解决方案文件夹中有库的重复副本,并且文件没有保持最新,这可以省去很多麻烦。

于 2014-02-27T04:20:31.370 回答
1

您说得对,您需要在.c使用它们的文件中包含必要的头文件。

编译器分别编译每个 C 文件,然后在最后将它们链接在一起,因此您收到错误unknown typename int_*,因为编译器在编译该 C 文件的上下文中没有看到相关的头文件。

对于定义和声明之间的区别,您似乎也有些困惑。

一个函数是:

  • 在头文件中声明。这意味着有一个函数原型,例如int some_func(char some_var);它告诉编译器该函数存在,但不告诉它它是什么。这是必要的,因为编译器一次只查看一个 C 文件,因此需要告知存在其他函数。
  • 在 C 文件中定义int some_func(char some_var) { do_stuff(some_var); }。这是实际的函数体,即. 在单独编译每个单独的 C 文件后,调用链接器将所有部分放在一起,并为您提供最终的二进制文件,然后将其闪存到设备中。

一个函数只能(并且必须)定义一次,但可以多次声明——即使在同一个文件中,只要声明不冲突。

于 2015-06-19T08:39:31.647 回答