makefile 调试分析方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile 调试分析方法相关的知识,希望对你有一定的参考价值。

参考技术A

字符串输出,可以加在任何地方,让你定位makefile运行位置。使用方法是在任何地方加入$(warning xxx xxx xxx ), make执行时就会执行到改行的时候打印出来xxx xxx xxx

注意echo只能在target:后面的语句使用且前面要有个TAB,使用方法如下

clean 这个目标不依赖于任何东西,因为冒号后面啥都没有写。 所以处理这个target的时候,只管执行关联动作rm -rf就好了。那么 (LIBSRCS:%.cpp=%.o) 这个好猜就是把LIBSRCS中所有的.cpp列表中的名字保持不变,把后缀修改为.o就变成了LIBOBJS的列表。至于LIBSRCS要把是一个个源文件指定,要吗用通配符指定。 LIBSRCS = (SRCDIR)/ .c (SRCDIR)/ .cpp` 简单的理解就是wildcard把通配符匹配的文件路径都列了出来以方便加入LIBSRCS

例子2 比如推导 make all
首先找all目标看是否要依赖啥
all:lib testExe
需要递归找lib和testExe分别的依赖
lib: $(LIBOBJS)
我们知道$LIBOBJS是一堆.o文件的列表,那么每个.o文件作为目标他们的依赖是啥需要继续推导

.cpp.o:是maikefile的简洁写法,也就是.o文件依赖于同名的.cpp文件,编译规则是 g++ -g $(INC) -c $< -o $@ 意思是如果没有某个.o文件就用这个规则通过同名的cpp文件生成一个。 <表示第一个依赖文件xxx.cpp。 $@表示目标文件xxx.o

在 C 中使用 makefile 标志进行调试

【中文标题】在 C 中使用 makefile 标志进行调试【英文标题】:Debugging using makefile flags in C 【发布时间】:2015-10-15 05:21:36 【问题描述】:

我需要设置一种方法来从 make 文件中调试我的程序。具体来说,当我输入make -B FLAG=-DNDEBUG 时,我需要程序正常运行。但是当这个标志不存在时,我需要在整个代码中运行一些assert() 命令。

为了澄清我需要知道如何检查我的 C 代码中是否不存在此标志,我假设它与 #ifndef 有关,我只是不知道从那里去哪里。

请原谅我的无知,任何回复将不胜感激!

【问题讨论】:

【参考方案1】:

假设您正在谈论标准库中的assert 宏(#defined in &lt;assert.h&gt;),那么您无需执行任何操作。该库已经处理了NDEBUG 标志。

如果您想让自己的代码仅在宏是 / 不是 #defined 时才执行操作,请使用 #ifdef,正如您在问题中已经怀疑的那样。

例如,我们可能有一个条件过于复杂,无法放入单个 assert 表达式中,因此我们需要一个变量。但是如果assert 扩展为空,那么我们不希望计算该值。所以我们可能会使用这样的东西。

int
questionable(const int * numbers, size_t length)

#ifndef NDEBUG
  /* Assert that the numbers are not all the same. */
  int min = INT_MAX;
  int max = INT_MIN;
  size_t i;
  for (i = 0; i < length; ++i)
    
      if (numbers[i] < min)
        min = numbers[i];
      if (numbers[i] > max)
        max = numbers[i];
    
  assert(length >= 2);
  assert(max > min);
#endif
  /* Now do what you're supposed to do with the numbers... */
  return 0;

请注意,这种编码风格会使代码难以阅读,并且 要求 Heisenbugs 极难调试。更好的表达方式是使用函数。

/* 1st helper function */
static int
minimum(const int * numbers, size_t length)

  int min = INT_MAX;
  size_t i;
  for (i = 0; i < length; ++i)
    
      if (numbers[i] < min)
        min = numbers[i];
    
  return min;


/* 2nd helper function */
static int
maximum(const int * numbers, size_t length)

  int max = INT_MIN;
  size_t i;
  for (i = 0; i < length; ++i)
    
      if (numbers[i] > max)
        max = numbers[i];
    
  return max;


/* your actual function */
int
better(const int * numbers, int length)

  /* no nasty `#ifdef`s */
  assert(length >= 2);
  assert(minimum(numbers, length) < maximum(numbers, length));
  /* Now do what you're supposed to do with the numbers... */
  return 0;

【讨论】:

【参考方案2】:

在使用或不使用“FLAG=-DNDEBUG”调用 make 时,您的 Makefile 中需要这样的规则:

%.o: %.c gcc -c $(FLAG) $<

在您的 C 代码中,您将需要这样的内容:

#ifndef NDEBUG
  fprintf(stderr, "My trace message\n");
#endif

【讨论】:

以上是关于makefile 调试分析方法的主要内容,如果未能解决你的问题,请参考以下文章

u-boot全面分析

主Makefile配置文件config.mk的分析

VSCode + make + makefile + c++ 断点调试

Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

SylixOS调试方法详解——性能分析

SylixOS 调试方法详解——静态代码分析