Можем ли мы включить исходный файл C другим способом?

#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. И возьмите некоторую документацию о разнице между компиляцией и компоновкой, которая поможет понять мир скомпилированных языков 🙂