【问题标题】:Missing header files for linked ".c" file链接的“.c”文件缺少头文件
【发布时间】:2013-06-30 13:37:06
【问题描述】:

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

【问题讨论】:

    标签: linker makefile


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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。我建议您重新设计问题,以便为您一开始遇到的真正问题找到解决方案,而不是试图以错误的方式解决真正问题时遇到的人为问题。

      【讨论】:

      • 我只是想在process-list.c中使用文件xen.c的一些函数,所以我需要链接它们。第一个链接器返回“错误:未定义对foo函数的引用”。但是这个错误消失了,因为我修改了Makefile并且编译器返回了上面提到的错误。现在我认为编译xen.c有问题,编译器找不到它包含的头文件!
      • 是的;看来 xen.c 打算在libvmi/driver 目录(或者libvmi 目录)中编译,而不是在当前目录中,所以当你尝试在错误的地方编译它时,它不会找到它需要的所有文件。因此,您应该本地化代码以便在当前目录中编译,或者使用libvmilibvmi/driver 目录中的库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多