我正在Cyclone V上进行裸机项目,现在我正在尝试在C中进行裸机应用。但是,在包含源文件时遇到了一些问题。
例如,我使用了alt_fpga_state_get()
中的函数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
我认为这是它们包含源文件的方式,但是我不确定。希望有人可以给我一个解决这个问题的线索。
谢谢!
答案 0 :(得分:1)
当#include
头文件时,您获得函数声明(取决于头文件的内容),但没有定义,您错过了链接所需的对象或lib文件
示例:
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 源文件,因此 mainc.c
中没有#include "f.c"