缺少链接的“.c”文件的头文件

时间:2013-06-30 13:37:07

标签: linker makefile

我已将“.c”文件与另一个文件相关联。 ld不会返回任何错误,但编译器无法在此“.c”文件中找到包含的头文件并返回此错误:

../libvmi/driver/xen.c:27:20: fatal error: libvmi.h: No such file or directory

这是我项目的Makefile:

## Source directory

SUBDIRS =  

INCLUDES = -I$(top_srcdir) $(top_srcdir)/libvmi
AM_LDFLAGS = -L$(top_srcdir)/libvmi/.libs/  $(top_srcdir)/libvmi/driver $(top_srcdir)/libvmi/libvmi.h
LDADD = -lvmi -lm $(LIBS)  $(top_srcdir)/libvmi/driver/xen.c $(top_srcdir)/libvmi/libvmi.h
bin_PROGRAMS = module-list process-list map-symbol map-addr dump-memory
module_list_SOURCES = module-list.c
process_list_SOURCES = process-list.c
map_symbol_SOURCES = map-symbol.c
map_addr_SOURCES = map-addr.c
dump_memory_SOURCES = dump-memory.c

如上所述,我想我应该将“$(top_srcdir)/ libvmi”添加到“INCLUDES”;这是libvmi.h所在的目录。

原始的Makefile是:

## Source directory

SUBDIRS = 

INCLUDES = -I$(top_srcdir)
AM_LDFLAGS = -L$(top_srcdir)/libvmi/.libs/
LDADD = -lvmi -lm $(LIBS)
c_sources = process-list.c $(top_srcdir)/libvmi/driver/xen.c
bin_PROGRAMS = module-list process-list map-symbol map-addr dump-memory
module_list_SOURCES = module-list.c
process_list_SOURCES = $(c_sources)
map_symbol_SOURCES = map-symbol.c
map_addr_SOURCES = map-addr.c
dump_memory_SOURCES = dump-memory.c

我已修改它以将“libvmi / driver / xen.c”链接到位于不同目录中的process-list.c文件。

这是因为Makefile中存在错误,是吗?

2 个答案:

答案 0 :(得分:1)

在您添加的路径中添加-I。请注意,这是编译器,而不是链接器问题<​​/ p>

答案 1 :(得分:0)

ld未返回错误的原因是因为未调用它。您获得的错误消息来自编译器,并且在编译器成功之前不会调用加载器。

是的,您需要将$(source_dir)/libvmi添加到INCLUDES;你只需要与现有条目对称地进行:

INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/libvmi

请注意目录名前面的-I。您在AM_LDFLAGSLDADD

中遇到了类似的问题
AM_LDFLAGS = -L$(top_srcdir)/libvmi/.libs/ -L$(top_srcdir)/libvmi/driver
LDADD = -lvmi -lm $(LIBS)

但你想要将头文件$(top_srcdir)/libvmi/libvmi.h添加到加载标志。标题不是库;标头不适合发送到链接器/加载器。您应该只为链接器/加载器提供目标文件,库和选项 - 没有源文件,没有标题。


或多或少处理表面问题。你想要解决的真正问题是什么?

如果您需要链接来自libvmi目录中构建的库的代码,为什么不在此makefile中进行依赖项更改以从libvmi目录中获取库(以及单独的在libvmi目录中运行库的构建?或者,如果你真的想在当前目录中进行编译(但为什么?),在本地创建libvmi文件的链接(或复制它们;不,再想一想,不要复制它们),以及在本地编译它们?混合目录工作充其量是痛苦的 - 并且尽可能避免,这几乎总是如此。

我注意到原始makefile实际上在链接行上包含-lvmi,所以我概述的是你期望使用的内容。为什么不适合你呢?这非常XY Problem。我建议重新处理这个问题,以便找到解决你开始时遇到的真正问题的方法,而不是试图以误导的方式解决实际问题所遇到的人为问题。