在自动工具中包含用于不同bin_Programs的不同库

Including different libraries for different bin_Programs in autotool

本文关键字:bin Programs 用于 工具 包含      更新时间:2023-10-16

我们正在使用 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 程序不需要在包含中@MYLIB_CFLAGS@,并且在尝试更新 Glibc 时这会导致问题。我的问题是是否有办法包含"a"应用程序的@MYLIB_CFLAGS@,但不包含"b"应用程序的。 `

目前,我们将相同的库包含在这两个库中 程序如下:

INCLUDES = -I@NE_ROOT@ -I@CORE_ROOT@/include @MYLIB_CFLAGS@ @BOOST_CFLAGS@ @LOG4CPP_CFLAGS@

弄清术语对您有利,因为这样可以更轻松地与他人就此类问题进行沟通并解释文档,例如 Automake 手册。 为此,INCLUDES变量的目的是保存编译器标志,这些标志指示应出现在 C 和 C++#include指令的搜索路径中的位置,或者为其他语言的编译器提供类似目的。 它只是间接地与库有关,当按预期使用时,它当然不会导致任何地方包含任何内容。

此外,与您的问题更直接相关,这使得INCLUDES变量成为各种*_CPPFLAGS变量的附属品,这些变量更通常用于传达旨在调节预处理器行为的标志。 这与旨在调节编译器本身行为的标志不同,为此指定了*_CFLAGS(C(、*_CXXFLAGS(C++( 和其他一些标志。 人们经常可以使用错误的变量来传达标志,但它确实会有所不同。 当然,对于特定于项目的变量,不需要遵守这些命名约定,但我更喜欢这样做以保持清晰。

因此,考虑到...

这是@MYLIB_CFLAGS@的定义:

MYLIB_CFLAGS=-I${mylib_include_dir}

......该变量传达的唯一标志是-I标志,因此如果我进行命名,则该变量将MYLIB_CPPFLAGS。 但这是一个特定于项目的变量,因此其名称的意义取决于您决定它是什么。

Makefile.am 中的变量为空,如下所示:

好吧,这不是很有用,我怀疑它实际上误导了你。 不必为自动生成指定空变量。 这样做与完全省略变量的含义与 Automake 没有不同的含义,但我怀疑它可能给您的印象是Makefile.am中给出的变量是唯一可用的每个目标变量。 他们不是。 事实上,手册中列出了更多。

特别是,有一些(名义上(变量applications_A_a_CPPFLAGSapplications_B_b_CPPFLAGS,您可以在其中列出特定于一个目标或另一个目标的预处理器标志。 这些是全局效应变量(如INCLUDES(累积的,因此解决所描述问题的一种方法是更改INCLUDES并添加applications_A_a_CPPFLAGS,如下所示:

INCLUDES = -I@NE_ROOT@ -I@CORE_ROOT@/include @BOOST_CFLAGS@ @LOG4CPP_CFLAGS@
applications_A_a_CPPFLAGS = @MYLIB_CFLAGS@

现在,@MYLIB_CFLAGS@中的标志将仅用于建筑applications_A_a

我还注意到,您说Makefile.am文件中列出的所有特定于目标的变量都是空的,这是可疑的。 这不一定是错的,但请注意,非仅标头的库也需要以某种方式在链接器变量中表示。 也许您有一个LDADD变量,通过该变量为所有目标指定相同的库(或者您可能使用AM_LDFLAGS执行此操作,这在某些情况下可能有效,但不正确,或者您可能使用LDFLAGS,这会更糟(。 如果需要这样做,那么指定特定于一个程序目标或另一个程序目标的二进制库的正确方法是通过变量applications_A_a_LDADDapplications_B_b_LDADD