【问题标题】:Can autotools produce unlinked objects rather than a library?自动工具可以生成未链接的对象而不是库吗?
【发布时间】:2014-01-02 23:00:04
【问题描述】:

在尝试解决此处发布的问题时:__start_section and __stop_section symbols missing when linking to library 我已经确定最好让我的 C autotools 项目在不生成库的情况下编译对象列表(或者我可以忽略该库只要因为存在中间对象)。这是我当前的 Makefile.am:

AM_CFLAGS = -I$(top_srcdir)/drivers/include
lib_LIBRARIES = libdriver.a
libdriver_a_SOURCES = $(STATIC_DRIVER_FILES)
STATIC_DRIVER_FILES = src/driver.c

if FLASH_SIM
STATIC_DRIVER_FILES += flash/flash_sim.c
endif

if UART_SIM
STATIC_DRIVER_FILES += uart/uart_sim.c
endif

这可以正常工作并创建 libdriver.a。我需要的是一个变量 STATIC_DRIVER_OBJS,其中包含我可以从主应用程序链接到的所有已编译对象的列表。上面发布的问题解释了为什么我不能直接链接库。

【问题讨论】:

  • 我不明白为什么你所拥有的 (libdriver.a) 不起作用。 .a 库应该只是 .o 文件的集合。
  • libdriver.a 包含 2 个对象。 driver.c 和 flash_sim.c。 flash_sim.c 定义了一堆静态 fns,它们通过放在自定义 ELF 部分中的数据结构公开。 driver.c 然后使用链接器在链接时定义的符号 __start_custom_section 枚举自定义部分。无论出于何种原因,如果我直接链接到目标文件,即:flash_sim.o,链接器将创建这些符号以指向该部分。但是,如果我链接到库,则不会创建这些符号(可能是因为该部分中的结构从未被直接引用)。
  • 它与 linux 模块 init 的发生方式非常相似,只是它们直接链接到目标文件(可能是因为这个原因)。如果我可以获得相对于顶部 srcdir 的目标文件列表,我应该能够使用 autotools 完成同样的事情。直接检查 Makefile 看起来我需要的东西在 libdriver_a_OBJECTS 中可用,但它没有被导出并且正在使用相对路径......
  • 好吧,那是有道理的。所以libdriver.a 正在被ar 破坏...
  • 是的,由于我是一个使用自动工具的菜鸟,我不知道如何导出包含所有目标文件的变量,以便它们可以被另一个 makefile 链接。

标签: c autotools


【解决方案1】:

你可以试试这样的:

whizbang_SOURCES = ... # the main executable
whizbang_LDADD = $(libdriver_a_OBJECTS) ...

我会更喜欢:

noinst_LTLIBRARIES = libdriver.la
...
libdriver_la_SOURCES = src/driver.c

if FLASH_SIM
libdriver_la_SOURCES += flash/flash_sim.c
endif
if UART_SIM
libdriver_la_SOURCES += uart/uart_sim.c
endif

...
whizbang_LDADD = $(libdriver_la_OBJECTS) ...

这样您就不必担心与libdriver.a 打交道(无需安装)。

【讨论】:

  • 这就是我希望完成的。我遇到了 2 个问题: 1. whizbang_LDADD 语句位于目录结构中的另一个 Makefile.am 中,并且 $(libdriver_a_OBJECTS) 从那里似乎不可见(我在生成的 makefile 末尾看到一个 .NOEXPORT )。 2. 由于它位于目录结构中的另一个位置,我需要想办法将 $(top_srcdir)/subdir/ 附加到每个对象。感谢您的帮助!
  • noinst 和使用 libtool 是一个很好的技巧。 autotools 中有这么多不错的功能,这就是我真正想要完成这项工作的原因。
【解决方案2】:

我最终使用 ldav1s 的上述答案完成了这项工作,并将我的项目转换为使用非递归 make。作为副作用,它似乎也编译得更快。这是我用来将其转换为非递归 make 的指南:https://www.flameeyes.eu/autotools-mythbuster/automake/nonrecursive.html。很高兴只需要维护一个 Makefile.am。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多