Как добавить файлы .c и .h в Atmel Studio 6?

Я знаю, что есть много вопросов по этой теме, и я просмотрел немало из них. Однако у меня все еще есть проблемы.

Я начал писать тестовую программу для прототипа печатной платы, и теперь, когда она выросла почти до 1000 строк, я пытаюсь разбить ее на библиотеки, которые я могу использовать для определенных функций.

Я думал, что это будет очень просто. Создайте файлы .c и .h для каждой необходимой мне библиотеки. т.е. Я бы использовал OLED.h и OLED.c для функций, управляющих OLED-дисплеем. Скопируйте соответствующие функции/определения в каждый файл. Затем скопируйте эти файлы в решение в Atmel Studio. Я помещаю их в папку src под названием проекта.

Однако это не работает! Я получаю чрезвычайно длинный список ошибок. Все, что определено в файле .h, по-видимому, не определено компилятором. Я также получаю много сообщений об ошибках типа "неизвестное имя типа int16_t/uint16_t/uint8_t/etc..." Эта часть меня действительно сбивает с толку. Какая разница, что функции находятся во внешней библиотеке, если теперь компилятор не понимает, что означают эти типы данных?

Так что, наверное, это глупая проблема. Я не хочу, чтобы Atmel Studio контролировала мои библиотеки, заключая их в какой-то «библиотечный проект» или что-то в этом роде, я хочу помещать их в папку по своему выбору и добавлять их, когда они мне нужны. Я искал ответы на эту проблему и нашел длинные руководства по изменению настроек компилятора для проекта, настроек компоновщика и т.д. .engblaze.com/tutorial-using-avr-studio-5-with-arduino-projects/#setup" rel="nofollow">http://www.engblaze.com/tutorial-using-avr-studio-5- with-arduino-projects/#setup

Я также не могу найти способ добавить что-то, щелкнув проект правой кнопкой мыши и нажав «Добавить». Он хочет, чтобы я нашел файлы .a. Диалоговое окно «Добавить библиотеку» в Atmel Studio кажется ужасным.

Конечно, не может быть так сложно просто добавить библиотеку в существующий проект и заставить ее нормально работать?! Я использовал PIC в прошлом, и, придя к Atmel, я нашел ужасную документацию и странный супергладкий интерфейс super-fly wiz bang, который не может оставить в покое и запутывает простую функцию. Что я могу сделать, чтобы добавить эти библиотеки?

ОБНОВЛЕНИЕ: Кажется, я ответил на свой вопрос. Оказывается, мне нужно было включить все библиотеки для распознавания типов данных и многого другого в файл .c. Я почему-то предполагал, что это нужно делать только в основном файле, но, очевидно, я ошибался. Добавление asf.h, похоже, работает хорошо, поскольку оно включает в себя все определения/имена портов, специфичные для MCU, и все такое. Все хорошо на данный момент!


person SVFeingold    schedule 06.06.2013    source источник


Ответы (2)


Добавление файлов библиотеки в решение должно быть простым. Перейдите в обозреватель решений, щелкните правой кнопкой мыши свое решение и выберите "Добавить->Существующий элемент". Если вы хотите добавить уже существующую библиотеку и сохранить ее в отдельной папке от вашего решения, щелкните стрелку рядом с «Добавить» и выберите «Добавить как ссылку». Это избавляет от многих головных болей из-за дублирования копии вашей библиотеки в папке решения и отсутствия актуальности файлов.

person Ernest3.14    schedule 27.02.2014

Вы правы, говоря, что вам нужно включить необходимые заголовочные файлы в .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-файла вызывается компоновщик, который собирает все части вместе и дает вам окончательный двоичный файл, который вы прошиваете на устройство.

Функция может быть (и должна быть) определена только один раз, но может быть объявлена ​​много раз — даже в одном и том же файле, если объявления не конфликтуют.

person Luke Wren    schedule 19.06.2015