Automake AM_LDADD解决方法

Vic*_*lea 5 c++ automake unit-testing makefile autotools

我想将相同的LDADD属性(单元测试库)设置为大量目标(单元测试C ++文件)。我首先尽管可能是automake具有AM_LDADD变量来将该库添加到文件中的所有目标,但事实并非如此。在一些邮件列表中,我发现了一些简短的讨论,要求添加它:http : //gnu-automake.7480.n7.nabble.com/AM-LIBS-AM-LDADD-td3698.html

我的问题是,您如何处理?有什么方法可以避免手动将LDADD属性添加到每个目标?

到目前为止,我的Makefile.am看起来像:

 test1_SOURCES = ...
 test1_LDADD = -llibrary 
  ...
  ...
 test20_SOURCES = ...
 test20_LDADD = -llibrary 
Run Code Online (Sandbox Code Playgroud)

Bre*_*ale 5

AM_LDADD变量的等效项是LDADD。例如,

LDADD = -llibrary

test1_SOURCES = ...
...
test20_SOURCES = ...
Run Code Online (Sandbox Code Playgroud)

如果您需要覆盖LDADD特定的程序:prog,则prog_LDADD始终优先。

我一直认为,由于没有LDADD传递标准环境变量configure(如您所见),configure --help因此没有真正的理由AM_LDADD。像configure脚本一样,这种方式以及任何选项(例如)--with-foo=<path>都应该(理想情况下)解决库依赖关系。

另一方面,CFLAGS通过configure可能仍需要AM_CFLAGS结合使用CFLAGS并与配置脚本确定的其他编译器标志结合使用;甚至是foo_CFLAGS替代。由于configure必须告知您的习惯CFLAGS


另外,我不知道这些test<n>程序是否仅使用单个C ++源文件,但是如果这样,则可以使用以下命令简化Makefile.am

LDADD = -llibrary

check_PROGRAMS = test1 test2 ... test20
AM_DEFAULT_SOURCE_EXT = .cc # or .cpp
Run Code Online (Sandbox Code Playgroud)

作为描述在这里


关于您的评论,您可以为此使用便利库 -这对于测试程序使用的通用代码特别有用:

noinst_LIBRARIES = libfoo.a  # or noinst_LTLIBRARIES = libfoo.la
libfoo_a_SOURCES = MyClass.hh MyClass.cc  # or libfoo_la_SOURCES

LDADD = ./libfoo.a -llibrary # or libfoo.la if using libtool.

... etc ...
Run Code Online (Sandbox Code Playgroud)