#c #eclipse #intel-fpga #bare-metal
#c #eclipse #intel-fpga #голый металл
Вопрос:
Я делаю проект «голый металл» на Cyclone V, и теперь я пытаюсь создать приложение «голый металл» на C. Однако у меня возникла некоторая проблема с включением исходного файла.
Например, я использую функцию alt_fpga_state_get()
from alt_fpga_manager.h
, но она выдает мне сообщение об ошибке
«неопределенная ссылка на ‘atl_fpga_state_get()’
Зная, что для этого нужен исходный файл, содержащий функцию, я без проблем импортирую исходный файл. Однако, здесь появляется еще одна вещь, которая внутри alt_fpga_manager.c
также выдает сообщение об ошибке
«неопределенная ссылка на ‘alt_clock_is_enable’
Затем я должен импортировать исходный файл для alt_clock_manager.h
, и проблема продолжается в том же духе, пока я не импортирую всю папку src. После этого вся проблема с «неопределенной ссылкой» решена, но возникает другая проблема, сообщающая мне, что мой OCRAM переполнен (я думаю, из-за добавления большого количества исходных файлов).
Я хотел бы знать, есть ли какое-либо решение для этого, потому что продолжать импортировать исходный файл — не самый удобный способ. Я просмотрел несколько примеров и обнаружил, что в них makefile
есть такая строка
HWLIBS_SRC := alt_reset_manager.c alt_clock_manager.c alt_spi.c alt_globaltmr.c alt_timers.c alt_watchdog.c
Я думаю, что это способ, которым они включают исходный файл, но я не уверен. Надеюсь, кто-нибудь сможет дать мне подсказку для решения этой проблемы.
Спасибо!
Комментарии:
1. #include позволяет объявлять функции, а не определять их, вам не хватает ссылки на дополнительные объектные файлы или библиотеки
2. Привет, Бруно, я понимаю, что ты имеешь в виду, и я решил это, импортировав файл .c напрямую в мой проект (я не считаю, что это хороший способ). Этот способ также вызвал проблему, о которой я говорил в своем посте. Не могли бы вы, пожалуйста, объяснить немного более четко, как связать его, или просто подскажите мне какой-нибудь источник / учебник, на который можно взглянуть? Большое спасибо!
3. что вы подразумеваете под импортом ? если вы #включите файл .c, да, это неверно. Я помещаю ответ
Ответ №1:
когда вы #include
создаете файл заголовка, вы получаете объявления функций (и т.д. В зависимости от содержимого файла заголовка), Которые их не определяют, вы пропустили ссылку на необходимый объект или файлы библиотеки
Пример :
main.c — это
#include "f.h"
int main()
{
f();
}
f.h — это
extern void f();
f.c — это
void f() {}
Если я просто рассмотрю main.c :
/tmp % gcc main.c
/tmp/ccFs7Gyz.o: In function `main':
main.c:(.text 0xa): undefined reference to `f'
collect2: ld returned 1 exit status
Но также учитывая f.c :
/tmp % gcc main.c f.c
Конечно, это также можно сделать в несколько шагов
/tmp % gcc -c f.c
/tmp % gcc main.c f.o
и т. Д
P.S. не #включайте исходный файл, поэтому нет #include "f.c"
в mainc.c
Комментарии:
1. И возьмите некоторую документацию о разнице между компиляцией и компоновкой, которая поможет понять мир скомпилированных языков 🙂