1

我已将“.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 出了点问题,是吗?

4

2 回答 2

1

将 -I 添加到您添加的路径。请注意,这是一个编译器,而不是链接器问题

于 2013-06-30T15:38:16.910 回答
0

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

是的,您确实需要添加$(source_dir)/libvmiINCLUDES; 您只需要与现有条目对称地进行操作:

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

注意-I前面的目录名称。AM_LDFLAGS您在and中有类似的问题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 问题。我建议重新处理这个问题,这样你就可以解决你一开始遇到的真正问题,而不是你遇到的人为问题,试图以一种被误导的方式解决真正的问题。

于 2013-06-30T16:16:33.490 回答