我们正在使用Autotools构建c++应用程序。我们在Makefile.am中创建两个bin_Programs,如下所示:bin_PROGRAMS = \ applications/A/a \ applications/B/b
目前,我们在以下两个程序中都包含相同的库:INCLUDES = -I@NE_ROOT@ -I@CORE_ROOT@/include @MYLIB_CFLAGS@ @BOOST_CFLAGS@ @LOG4CPP_CFLAGS@
这是@MYLIB_CFLAGS@
的定义:
MYLIB_CFLAGS=-I${mylib_include_dir}
Makefile.am中的变量为空,如下所示:
applications_A_a_SOURCES =
applications_A_a_LDADD =
applications_A_a_LDFLAGS =
并且我们为b程序定义了相同的变量。
我注意到b程序在includes中不需要
@MYLIB_CFLAGS@
,并且在尝试更新Glibc时会引起问题。我的问题是是否有办法为“a”应用程序而不是“b”应用程序包括@MYLIB_CFLAGS@
。`
最佳答案
直截了当地讲对您来说是有利的,因为这将使与他人就此类问题进行交流和解释the Automake manual等文档变得更加容易。为此,INCLUDES
变量旨在满足的目的是保存编译器标志,这些标志指示应在C和C++ #include
指令的搜索路径中出现的位置,或者为其他语言的编译器起类似作用。它只是间接地与库有关,并且按预期使用时,肯定不会导致任何地方包含任何内容。
此外,与您的问题更直接相关的是,这使INCLUDES
变量与各种*_CPPFLAGS
变量相辅相成,这些*_CFLAGS
变量通常用于传达旨在调制预处理器行为的标志。这与旨在调制适当的编译器行为的标志有所不同,为此指定了*_CXXFLAGS
(C),-I
(C++)和其他一些标志。通常可以使用错误的变量来传递标志,但是这样做确实有所不同。当然,不需要为特定于项目的变量遵守这些命名约定,但是我更愿意这样做以保持清楚。
因此,考虑...
...由该变量传达的唯一标志是MYLIB_CPPFLAGS
标志,因此,如果我进行命名,则该变量将为Makefile.am
。但这是一个特定于项目的变量,因此,其名称的含义取决于您决定的名称。
嗯,这不是很有用,我怀疑它实际上误导了您。不必为Automake指定空变量。这样做对Automake的意义与完全忽略变量没有什么不同,但是我怀疑这可能给您一种印象,即applications_A_a_CPPFLAGS
中给出的变量是唯一可用的按目标变量。他们不是。实际上,还有更多,如in the manual所示。
特别地,存在(概念上)变量applications_B_b_CPPFLAGS
和INCLUDES
,您将在其中列出特定于一个目标或另一个目标的预处理器标志。这些是带有全局影响的变量(例如INCLUDES
)累积的,因此可以解决上述问题的一种方法是更改applications_A_a_CPPFLAGS
并添加@MYLIB_CFLAGS@
,如下所示:
INCLUDES = -I@NE_ROOT@ -I@CORE_ROOT@/include @BOOST_CFLAGS@ @LOG4CPP_CFLAGS@
applications_A_a_CPPFLAGS = @MYLIB_CFLAGS@
现在
applications_A_a
中的标志将仅用于构建Makefile.am
。我还注意到,您说
LDADD
文件中列出的所有特定于目标的变量都是空的,这令人怀疑。不一定是错误的,但是请注意,并非仅 header 的库也需要以某种方式在链接器变量中表示。也许您有一个AM_LDFLAGS
变量,通过该变量为所有目标指定了相同的库(或者您可以使用LDFLAGS
进行此操作,这在某些情况下可能有效,但可能不正确,或者您使用applications_A_a_LDADD
,这会更糟)。如果需要执行此操作,则可以通过变量applications_B_b_LDADD
和ojit_code来指定特定于一个程序目标或另一个程序目标的二进制库的正确方法。关于c++ - 在自动工具中包含用于不同bin的不同库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59841153/