我们可以通过其他方式包含C源文件吗?

时间:2019-03-14 09:06:59

标签: c eclipse intel-fpga bare-metal

我正在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 

我认为这是它们包含源文件的方式,但是我不确定。希望有人可以给我一个解决这个问题的线索。

谢谢!

1 个答案:

答案 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"