当试图解决这里发布的问题:__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,它包含我可以从主应用程序链接到的所有编译对象的列表。上面发布的问题解释了为什么我不能直接链接库。
答案 0 :(得分:0)
您可以尝试以下方式:
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
(无安装)。
答案 1 :(得分:0)
我最终使用ldav1s上面的答案完成了这个并将我的项目转换为使用非递归make。作为副作用,它似乎编译得更快。以下是我用来将其转换为非递归make的指南:https://www.flameeyes.eu/autotools-mythbuster/automake/nonrecursive.html。很高兴只需要维护一个Makefile.am。