我们可以用另一种方式包含C源文件吗?

问题描述 投票:0回答:1

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

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

谢谢 !

c eclipse intel-fpga bare-metal
1个回答
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

等等

附:不要#include源文件,所以mainc.c中没有#include "f.c"

© www.soinside.com 2019 - 2024. All rights reserved.