2013-06-30 2 views
1

Я связал файл «.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, да?

ответ

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 локально (или скопируйте их, нет, поразмыслите, не скопируйте их) и скопируйте их локально? Работа с смешанным каталогом в лучшем случае болезненна - и этого следует избегать, когда это возможно, что почти всегда.

Отметьте, что исходный make-файл действительно включает -lvmi в линию ссылок, поэтому я изложил то, что вы ожидали использовать. Почему это не работает для вас? Это очень XY Problem. Я рекомендую переработать вопрос, чтобы вы получили решение реальной проблемы, с которой вы начали, а не искусственной проблемой, с которой вы столкнулись с попыткой решить настоящую проблему ошибочным способом.

+0

Я просто хочу использовать некоторые функции файла xen.c в process-list.c, поэтому мне нужно связать их. Первый компоновщик возвратил «error: undefined reference to foo function». но эта ошибка исчезла, поскольку я модифицировал Makefile, и компилятор вернул ошибку, упомянутую выше. Теперь я думаю, что что-то не так с компиляцией xen.c, что его включенные заголовочные файлы не могут быть найдены компилятором! – Mjina

+0

Да; похоже, что xen.c предназначен для компиляции в каталоге 'libvmi/driver' (или, возможно, в каталоге' libvmi'), а не в текущем каталоге, поэтому, когда вы пытаетесь скомпилировать его в неположенном месте, t найти все необходимые ему файлы. Таким образом, вы должны либо локализовать код, чтобы он компилировался в текущем каталоге, либо использовать библиотеку из каталога libvmi или libvmi/driver. –

1

Добавьте -I к введенному вами пути. Обратите внимание, что это компилятор, а не вопрос линкера.

Смежные вопросы