【问题标题】:CFLAGS CPPFLAGS and LDFLAGS invoke cc but don't pass the values to gccCFLAGS CPPFLAGS 和 LDFLAGS 调用 cc 但不将值传递给 gcc
【发布时间】:2018-02-23 13:41:33
【问题描述】:

我编写了一个简单的 printf C 代码并制作了一个简单的 makefile。 当我使用 CFLAGS、CPPFLAGS 和 LDFLAGS 运行 make 时,变量的值进入 cc 执行,然后是没有这些值的 gcc 执行,如下所示:

$ CFLAGS="-I." CPPFLAGS="-D TESTEDEFINE" CXXFLAGS="TESTECXXFLAGS" LDFLAGS="-L." LFLAGS="TESTELFLAGS" make
cc -I. -D TESTEDEFINE -L.  teste.c   -o teste
gcc -o teste teste.c

当我运行构建的程序时,未定义定义,因为它为我提供了未定义 #else 的 printf。

teste.c

#include <stdio.h>

int main()
{
#if defined(TESTEDEFINE)
  printf("TESTEDEFINE!!!");
#else
  printf("!!!");
#endif
  return 0;
}

生成文件

all: teste
  gcc -o teste teste.c

【问题讨论】:

  • 如果你告诉它运行gcc -o teste teste.c,它就会运行。如果您删除了该行,您可能会发现宏有效。或者使用${CC} -o $@ ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} ${LDLIBS} 作为配方行。
  • 所以这些标志只有在我在 Makefile 中显式使用它们或者我省略了规则的命令时才有效?
  • 可能有助于完整地查看您的makefile ...或者您所展示的内容是什么?如果是这样,那您可不是在开玩笑说“简单的 makefile”
  • Makefile 告诉 make all 依赖于 teste 的构建,因此 make 在执行配方之前使用其内置规则构建 teste。这就是调用cc 的原因。
  • 你试试 Gnu 网站的这一部分:gnu.org/software/make/manual

标签: c gcc makefile cflags ldflags


【解决方案1】:

变量是为了一致性、可读性和易用性。您的编译和生成文件都没有引用它们。编译器不会自动引用这些变量。

试试这个:

$ export CFLAGS="-I." CPPFLAGS="-D TESTEDEFINE" CXXFLAGS="TESTECXXFLAGS" LDFLAGS="-L." LFLAGS="TESTELFLAGS"
$ gcc $CFLAGS $CPPFLAGS $CXXFLAGS $LDFLAGS $LFLAGS -o teste teste.c

您还需要在 makefile 中定义它们并在编译器行中引用它们。

【讨论】:

  • 目标是使用make,而不是直接从命令行使用GCC。
猜你喜欢
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 2013-04-21
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多