gpt4 book ai didi

c++ - 在 autotool 中包含不同 bin_Programs 的不同库

转载 作者:行者123 更新时间:2023-12-02 10:21:49 24 4
gpt4 key购买 nike

我们正在使用 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 时,这会导致问题。我的问题是是否有办法包含 @MYLIB_CFLAGS@适用于“a”应用程序,但不适用于“b”应用程序。
`

最佳答案

Currently, we are including the same libraries to both of these programs as below:

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


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

此外,与您的问题更直接相关,这使得 INCLUDES变量是各种 *_CPPFLAGS 的附属物更一般地用于传达旨在调节预处理器行为的标志的变量。这与旨在调节编译器行为的标志不同,对于后者 *_CFLAGS (C), *_CXXFLAGS (C++) 和其他一些指定。人们通常可以通过使用错误的变量来传达标志而逃脱惩罚,但这确实会产生一些不同。当然,对于特定于项目的变量,不需要遵守这些命名约定,但我更愿意这样做以保持清晰。

因此,考虑...

This is the definition of @MYLIB_CFLAGS@:

MYLIB_CFLAGS=-I${mylib_include_dir}


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

The variables in Makefile.am are empty as below:



嗯,这不是很有用,我怀疑它实际上误导了你。没有必要为 Automake 指定空变量。这样做对 Automake 的意义与完全省略变量没有什么不同,但我怀疑它可能给您的印象是 Makefile.am 中给出的印象。是唯一可用的每个目标变量。他们不是。事实上,还有更多,如所列 in the manual .

特别是,有(名义上的)变量 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 中列出的所有特定于目标的变量是可疑的。文件为空。这不一定是错误的,但请注意,不是仅 header 的库也需要以某种方式在链接器变量中表示。也许你有一个 LDADD为所有目标指定相同库的变量(或者您可能使用 AM_LDFLAGS 这样做,这在某些情况下可能有效但不正确,或者您使用 LDFLAGS ,这会更糟)。如果您需要这样做,那么指定特定于一个程序目标或另一个程序目标的二进制库的正确方法是通过变量 applications_A_a_LDADDapplications_B_b_LDADD .

关于c++ - 在 autotool 中包含不同 bin_Programs 的不同库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59841153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com