GNU AutoMake中的显式中间对象文件

时间:2010-06-26 02:42:54

标签: c autotools automake

我有一个C应用程序,我正在从一组手工编码的Makefile转换为GNU AutoMake。它有一个子目录,包含一个接口头和几个与平台相关的实现。目前,选择了一个实现并将其构建到该目录中具有固定名称的目标文件。然后,使用驱动程序接口的代码链接到该目标文件,并自动获得正确的驱动程序。

将此系统转换为使用AutoTools的最佳方法是什么?我已经有AutoConf创建替换正确的驱动程序实现文件。我只是弄清楚如何获得一个AutoMake目标,其EXTRA_*_SOURCES*_LDADD变量我可以将实现文件放入。我只需要放弃中间目标文件并将它们放入使用它们的程序目标列表?

编辑:感谢ptomato。

由于Automake的依赖性解析,所有可能的来源必须在*_SOURCESEXTRA_*_SOURCES中命名,如the Conditional Sources section of the manual中所述。因此,库节实际上是:

noinst_LIBRARIES = libdriver.a
libdriver_a_SOURCES = driver.h
EXTRA_libdriver_a_SOURCES = driver-linux.c driver-windows.c driver-osx.c
libdriver_a_LIBADD = @DRIVERIMPL@

1 个答案:

答案 0 :(得分:2)

您可以构建一个便利库,并将其静态链接到您的应用程序。这与目标文件之间的差异最终很小。请参阅Automake手册的this page。基本上它是这样的:

noinst_LIBRARIES = libdriver.a
libdriver_a_SOURCES = @CORRECT_IMPLEMENTATION_FILE@
myprogram_LDADD = libdriver.a

其中具有固定名称的中间对象文件为libdriver.a,您的应用程序为myprogram

然而,这似乎对我来说不必要的复杂。我没有看到你为什么不应该放弃中间对象文件并将实现文件放在使用它们的程序目标中。