26

我有一个简单的 Autotools C 项目(不是 C++)。

CFLAG(通过检查)似乎是-g -O2.

我希望所有生成的 make 文件也-std=gnu99附加到 CFLAG,因为我使用for (int i = 0; i < MAX; i++)和类似的。

我显然可以破解 Makefile,但这会在./configure.

添加(或更改)代码所需的 CFLAG(而不是用户可能想要更改的那些 CFLAG)的正确位置在哪里?

(请注意,这是在(Eclipse CDT)自动工具项目中添加 CFLAG 的位置的部分副本,例如 -std=gnu99,因为我得到了我不想要的 Eclipse 特定答案。)


@DevSolar 的回答还没有帮助。一个configure.ac文件(下)生成configure脚本(也在下)。

配置.ac:

dnl Process this file with autoconf to produce a configure script.

CFLAGS="$CFLAGS -std=gnu99"
AC_PREREQ(2.59)
AC_INIT(tuntest, 1.0)


AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE()

AC_PROG_CC

AC_CONFIG_FILES(Makefile src/Makefile)
AC_OUTPUT

$ grep CFLAGS 配置

CFLAGS
CFLAGS
To assign environment variables (e.g., CC, CFLAGS...), specify them as
  CFLAGS      C compiler flags
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
   CFLAGS="-g"
  CFLAGS=""
     CFLAGS="-g"
if test "$ac_test_CFLAGS" = set; then
  CFLAGS=$ac_save_CFLAGS
    CFLAGS="-g -O2"
    CFLAGS="-g"
    CFLAGS="-O2"
    CFLAGS=
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
4

3 回答 3

25

autoconf 有一个宏:

只是说:

AC_PROG_CC_STDC

在你之后AC_PROG_CC,一切都会好起来的。

尤其是当您使用默认情况下没有-std=gnu99但在 C99 模式下运行的其他编译器时(或者想到 hpcc 的不同选项-AC99)。

不会用于CFLAGS那种事情。

文档

-- 宏:AC_PROG_CC_STDC
如果 C 编译器无法编译 ISO 标准 C(当前为 C99),
尝试为输出变量“CC”添加一个选项以使其工作。如果
编译器不支持 C99,回退到支持 ANSI
C89 (ISO C90)。

调用该宏后可以检查C编译器是否有
已设置为接受标准 C;如果没有,shell 变量
`ac_cv_prog_cc_stdc' 设置为 `no'。
于 2012-07-25T13:09:54.000 回答
4

虽然使用宏 likeAC_PROG_CC_STDC比向 CFLAGS 添加编译器选项更可取,但 autoconf 目前没有启用 C11 编译器支持的宏——还没有AC_PROG_CC_C11,并且AC_PROG_CC_STDC只添加了-std=gnu99gcc 选项而不是-std=gnu11or -std=c11

您可以通过简单地添加编译器标志

CFLAGS="$CFLAGS -std=c11"

在configure.ac中。

或者,最好先检查编译器是否支持添加的选项,否则打印警告,告诉用户手动向 CFLAGS 添加适用于其编译器的等效选项:

AX_CHECK_COMPILE_FLAG([-std=c11],
  [AX_APPEND_FLAG([-std=c11])],
  [AC_MSG_WARN([-std=c11 not supported, you may have to set CFLAGS to enable C11 support.])
])

这使用GNU Autoconf ArchiveAX_CHECK_COMPILE_FLAG中的和AX_APPEND_FLAG宏。要使用它们,请将它们放入子目录并添加到 configure.acm4AC_CONFIG_MACRO_DIR([m4])

于 2015-03-08T16:35:57.623 回答
0

这个主题在 Automake 手册27.6 Flag Variables Ordering中有介绍。configure.ac和之间存在交互Makefile.am,它不仅仅是设置隐式 make 规则中使用的众所周知的 shell 变量。

简而言之,您应该将其设置在一个名为mumble_CFLAGSAutomake 手册中讨论的新变量中。mumble只是您的程序的名称,通常是foobar在其他示例中。稍后,当您的 makefile 被创建时,您的程序(mumblefoobar)的配方将用于$(mumble_CFLAGS) $(CFLAGS)构建目标。

这是它的外观示例。它不使用mumbleorfoobar,而是my_prog用作工件名称。

配置.ac

# Perform a compile test using -std=gnu99, set has_gnu99
if test "$has_gnu99" -eq "1"; then
  AC_SUBST([MY_GNU99], [-std=gnu99])
fi

生成文件.am

bin_PROGRAMS = my_prog
my_prog_CFLAGS = $(MY_GNU99) $(MY_ANOTHER_FLAG) $(MY_YET_ANOTHER_FLAG) ...

稍后,当生成 makefile 时,它​​将有一个类似于以下的配方,其中$(MY_PROG_CFLAGS)应用于所有 build 的对象my_prog

my_prog :
    $(CC) $(CPPFLAGS) $(MY_PROG_CFLAGS) $(CFLAGS) -c $< -o $@

的额外间接my_prog_CFLAGS允许您为不同的目标设置多个标志。例如,您可以有 a my_prog_CFLAGS、 amy_archive_CFLAGS和 a my_sharedobj_CFLAGS

而且它不限于my_prog_CFLAGS. 您还可以在 makefile 中隐式使用my_prog_CPPFLAGS,和其他变量。my_prog_CXXFLAGS


这是来自Automake 手册

编译标志变量

本节试图回答上述所有问题。我们将在我们的示例中主要讨论 CPPFLAGS,但实际上答案适用于 Automake 中使用的所有编译标志:CCASFLAGS、CFLAGS、CPPFLAGS、CXXFLAGS、FCFLAGS、FFLAGS、GCJFLAGS、LDFLAGS、LFLAGS、LIBTOOLFLAGS、OBJCFLAGS、OBJCXXFLAGS、RFLAGS、UPCFLAGS和 YFLAGS。

CPPFLAGS、AM_CPPFLAGS 和 mumble_CPPFLAGS 是三个可用于将标志传递给 C 预处理器的变量(实际上这些变量也用于其他语言,如 C++ 或预处理的 Fortran)。CPPFLAGS 是用户变量(参见用户变量),AM_CPPFLAGS 是 Automake 变量,而 mumble_CPPFLAGS 是特定于 mumble 目标的变量(我们称其为每个目标变量,参见程序和库变量)。

Automake 在编译 C 源文件时总是使用其中两个变量。当为 mumble 目标编译目标文件时,第一个变量将是 mumble_CPPFLAGS(如果已定义),否则为 AM_CPPFLAGS。第二个变量始终是 CPPFLAGS。

在以下示例中,

bin_PROGRAMS = foo bar
foo_SOURCES = xyz.c
bar_SOURCES = main.c
foo_CPPFLAGS = -DFOO
AM_CPPFLAGS = -DBAZ

xyz.o 将使用 '$(foo_CPPFLAGS) $(CPPFLAGS)' 编译,(因为 xyz.o 是 foo 目标的一部分),而 main.o 将使用 '$(AM_CPPFLAGS) $(CPPFLAGS)' 编译(因为目标栏没有每个目标变量)。

mumble_CPPFLAGS 和 AM_CPPFLAGS 的区别已经很清楚了,让我们关注 CPPFLAGS。CPPFLAGS 是用户变量,即用户有权修改以编译包的变量。与许多其他变量一样,此变量记录在“configure --help”输出的末尾。

例如,需要将 /home/my/usr/include 添加到 C 编译器的搜索路径的人会配置一个包

./configure CPPFLAGS='-I /home/my/usr/include'

并且此标志将传播到所有 Makefile 的编译规则。

于 2017-11-04T15:05:41.767 回答