我在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
我认为这是他们包含源文件的方式,但我不确定。希望有人能给我一个解决这个问题的线索。
谢谢 !
当你#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"