【发布时间】: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 链接。