在autotool中为不同的bin_程序包含不同的库 我们正在用AutoToo工具构建C++应用程序。我们正在Makefile.am中创建两个bin_程序,如下所示: applications_A_a_SOURCES = applications_A_a_LDADD = applications_A_a_LDFLAGS =

在autotool中为不同的bin_程序包含不同的库 我们正在用AutoToo工具构建C++应用程序。我们正在Makefile.am中创建两个bin_程序,如下所示: applications_A_a_SOURCES = applications_A_a_LDADD = applications_A_a_LDFLAGS =,c++,makefile,build,autotools,autoconf,C++,Makefile,Build,Autotools,Autoconf,bin_程序=\ 申请书/A/A\ 应用程序/B/B 目前,我们为这两个程序提供了相同的库,如下所示: applications_A_a_SOURCES = applications_A_a_LDADD = applications_A_a_LDFLAGS = INCLUDES=-I@NE_ROOT@ -I@CORE_ROOT@/包括@MYLIB\u CFLAGS@@BOOST\u CFLAGS@@LOG4CPP\u CFLAGS@ 这是@MYLIB\CFLAGS@的定义: MYLIB_

bin_程序=\
申请书/A/A\
应用程序/B/B

目前,我们为这两个程序提供了相同的库,如下所示:

applications_A_a_SOURCES = 

applications_A_a_LDADD =

applications_A_a_LDFLAGS =
INCLUDES=-I@NE_ROOT@ -I@CORE_ROOT@/包括@MYLIB\u CFLAGS@@BOOST\u CFLAGS@@LOG4CPP\u 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\u CFLAGS@
,在尝试更新Glibc时,这会导致问题。我的问题是,是否有办法将
@MYLIB\u CFLAGS@
包含在“a”应用程序中,而不是包含在“b”应用程序中。 `

目前,我们正在将相同的库包含到这两个库中 计划如下:

INCLUDES = -I@NE_ROOT@ -I@CORE_ROOT@/include @MYLIB_CFLAGS@ @BOOST_CFLAGS@ @LOG4CPP_CFLAGS@
把术语弄清楚对您来说是有利的,因为这样可以更容易地与其他人就此类问题进行沟通,并解释文档,例如。为此,<>代码>所要服务的目的包括变量,它是保存编译器标志,它指示在C和C++中的搜索路径中出现的位置,包含< <代码>指令,或者类似于其他语言编译器的目的。它只是间接地与库有关,当按预期使用时,它肯定不会导致在任何地方包含任何内容

此外,与您的问题更直接相关的是,这使得
包括
变量,作为各种
*\u cppfaglass
变量的附属物,这些变量通常用于传递用于调节预处理器行为的标志。这与用于调节编译器本身行为的标志不同,为其指定了
*\u CFLAGS
(C)、
*\u cxflags
(C++)和其他一些标志。通常,使用错误的变量来传递标志是可以避免的,但这确实有点不同。当然,对于特定于项目的变量,不需要遵守这些命名约定,但我更愿意这样做以保持清楚

因此,考虑到

这是“MYLIB\u CFLAGS”的定义:

MYLIB_CFLAGS=-I${mylib_include_dir}
。。。该变量传递的唯一标志是
-I
标志,因此,如果我进行命名,该变量将是
MYLIB\u CPPFLAGS
。但这是一个特定于项目的变量,因此它的名称的意义取决于您的决定

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

INCLUDES = -I@NE_ROOT@ -I@CORE_ROOT@/include @MYLIB_CFLAGS@ @BOOST_CFLAGS@ @LOG4CPP_CFLAGS@
这不是很有用,我怀疑这实际上误导了你。没有必要指定空变量来自动生成。这样做对Automake的意义与完全省略变量没有什么不同,但我怀疑这可能会给您一种印象,即
Makefile.am
中给出的变量是唯一可用的每个目标变量。事实并非如此。事实上,还有很多,如清单所示

特别是,有(理论上)变量
applications\u A\u CPPFLAGS
applications\u B\u CPPFLAGS
,您可以在其中列出特定于一个目标或另一个目标的预处理器标志。这些都是累积的全局效应变量,例如
包含
,因此解决所述问题的一种方法是更改
包含
并添加
应用程序_A_A_CPPFLAGS
,如下所示:

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

applications_A_a_CPPFLAGS = @MYLIB_CFLAGS@
现在,
@MYLIB\u CFLAGS@
中的标志将仅用于构建
应用程序


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

谢谢我得到了答案。关于LDADD,您是对的,我错过了一些库被添加到LDADD应用程序之一,但不是mylib。实际上,Mylib是一个具有两个头文件的共享对象。我看不到我们正在将.so文件添加到LDADD的任何地方,但在make期间更新GLibc时,我收到一条警告,即交叉编译器中使用的STDC++与用于mylib.so的STDC++冲突。正因为如此,我认为包括就是包括图书馆。