我已将“.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中存在错误,是吗?
答案 0 :(得分:1)
在您添加的路径中添加-I。请注意,这是编译器,而不是链接器问题</ p>
答案 1 :(得分:0)
ld
未返回错误的原因是因为未调用它。您获得的错误消息来自编译器,并且在编译器成功之前不会调用加载器。
是的,您需要将$(source_dir)/libvmi
添加到INCLUDES
;你只需要与现有条目对称地进行:
INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/libvmi
请注意目录名前面的-I
。您在AM_LDFLAGS
和LDADD
:
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。我建议重新处理这个问题,以便找到解决你开始时遇到的真正问题的方法,而不是试图以误导的方式解决实际问题所遇到的人为问题。