Я связал файл «.c» с другим. ld
не возвращает ошибку, но компилятор не может найти вложенные файлы заголовков в этом файле «.c» и возвращает эту ошибку:Отсутствует файл заголовка для связанного файла «.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/водитель/xen.c" для обработки-list.c файла, которые расположены в разных каталогах.
Это из-за чего-то не так в Makefile, да?
Я просто хочу использовать некоторые функции файла xen.c в process-list.c, поэтому мне нужно связать их. Первый компоновщик возвратил «error: undefined reference to foo function». но эта ошибка исчезла, поскольку я модифицировал Makefile, и компилятор вернул ошибку, упомянутую выше. Теперь я думаю, что что-то не так с компиляцией xen.c, что его включенные заголовочные файлы не могут быть найдены компилятором! – Mjina
Да; похоже, что xen.c предназначен для компиляции в каталоге 'libvmi/driver' (или, возможно, в каталоге' libvmi'), а не в текущем каталоге, поэтому, когда вы пытаетесь скомпилировать его в неположенном месте, t найти все необходимые ему файлы. Таким образом, вы должны либо локализовать код, чтобы он компилировался в текущем каталоге, либо использовать библиотеку из каталога libvmi или libvmi/driver. –