首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CFLAG (如-std=gnu99 )添加到autotools项目的位置

将CFLAG (如-std=gnu99 )添加到autotools项目的位置
EN

Stack Overflow用户
提问于 2012-07-25 09:57:56
回答 2查看 32.7K关注 0票数 27

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

CFLAG(经检查)似乎是-g -O2

我希望所有生成的make文件都附加到CFLAG中,因为我使用的是-std=gnu99和类似的。

我显然可以破解Makefile,但是它会在./configure上被覆盖。

代码所需的添加(或更改)CFLAG的正确位置在哪里(与用户可能希望更改的CFLAG相比)?

(注意,这是将CFLAG (如-std=gnu99 )添加到(Eclipse )自动工具项目的位置的部分复制,因为我得到的是特定于Eclipse的答案,我不想要。)

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

configure.ac:

代码语言:javascript
复制
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配置

代码语言:javascript
复制
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'
EN

回答 2

Stack Overflow用户

发布于 2015-03-08 16:35:57

虽然使用像AC_PROG_CC_STDC这样的宏比向CFLAGS添加编译器选项更可取,但autoconf目前还没有支持C11编译器的宏--还没有AC_PROG_CC_C11,而AC_PROG_CC_STDC只为gcc添加了-std=gnu99选项,而不是-std=gnu11-std=c11

您可以简单地通过将

代码语言:javascript
复制
CFLAGS="$CFLAGS -std=c11"

在configure.ac里。

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

代码语言:javascript
复制
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.])
])

这使用在AX_CHECK_COMPILE_FLAG中找到的AX_APPEND_FLAG宏和GNU Autoconf档案馆宏。要使用它们,请将它们放到m4子目录中,并将AC_CONFIG_MACRO_DIR([m4])添加到configure.ac中。

票数 4
EN

Stack Overflow用户

发布于 2017-11-04 15:05:41

本主题已在“自动手册”( 27.6旗变量排序 )中介绍。configure.acMakefile.am之间存在交互,它不仅仅是设置一个众所周知的用于隐式生成规则的shell变量。

它的缺点是,您应该将其设置在一个名为“自动手册”中讨论的mumble_CFLAGS的新变量中。mumble只是程序的名称,在其他示例中通常是foobar。稍后,当创建makefile时,程序的配方(mumblefoobar)将使用$(mumble_CFLAGS) $(CFLAGS)构建目标。

下面是一个例子,说明它的外观。它没有使用mumblefoobar,而是使用my_prog作为工件名称。

configure.ac

代码语言:javascript
复制
# Perform a compile test using -std=gnu99, set has_gnu99
if test "$has_gnu99" -eq "1"; then
  AC_SUBST([MY_GNU99], [-std=gnu99])
fi

Makefile.am

代码语言:javascript
复制
bin_PROGRAMS = my_prog
my_prog_CFLAGS = $(MY_GNU99) $(MY_ANOTHER_FLAG) $(MY_YET_ANOTHER_FLAG) ...

稍后,生成makefile时,它将有一个类似于下面的菜谱,其中$(MY_PROG_CFLAGS)应用于所有构建my_prog的对象

代码语言:javascript
复制
my_prog :
    $(CC) $(CPPFLAGS) $(MY_PROG_CFLAGS) $(CFLAGS) -c $< -o $@

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

它并不局限于my_prog_CFLAGS。您还可以在makefile中隐式地使用my_prog_CPPFLAGSmy_prog_CXXFLAGS和其他变量。

这是来自自动手册

编译标志变量 本节试图回答上述所有问题。我们将在我们的示例中主要讨论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是特定于目标的变量(我们称之为每个目标变量,参见Program变量)。 当编译C源文件时,Automake总是使用其中的两个变量。当为目标编译对象文件时,第一个变量将是mumble_CPPFLAGS (如果定义的话),或者AM_CPPFLAGS (否则)。第二个变量总是CPPFLAGS。 在下面的示例中, bin_PROGRAMS = foo bar foo_SOURCES = xyz.c bar_SOURCES = main.c foo_CPPFLAGS = -DFOO AM_CPPFLAGS = -DBAZ O将使用‘$(Foo_CPPFLAGS)$(CPPFLAGS)’编译(因为xyz.o是foo目标的一部分),而main.o将使用‘$(AM_CPPFLAGS)$(CPPFLAGS)’编译(因为目标条没有每个目标变量)。 mumble_CPPFLAGS和AM_CPPFLAGS之间的区别很明显,让我们来关注CPPFLAGS。CPPFLAGS是一个用户变量,即用户有权修改以编译包的变量。和许多其他变量一样,这个变量在“配置--帮助”输出的末尾被记录下来。 例如,需要将/home/my/usr/include添加到C编译器的搜索路径的人将使用 ./配置CPPFLAGS='-I /home/my/usr/include‘ 这个标志将被传播到所有Makefile的编译规则。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11647208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档