【问题标题】:Is optimization and generating debug info part of compilation or linkage优化和生成调试信息是否是编译或链接的一部分
【发布时间】:2009-08-21 23:51:04
【问题描述】:

我正在从其他人那里读取 Makefile,如下所示。

LDFLAGS=-lm -ljpeg -lpng

ifeq ($(DEBUG),yes)
        OPTIMIZE_FLAG = -ggdb3 -DDEBUG -fno-omit-frame-pointer
else
        OPTIMIZE_FLAG = -ggdb3 -O3
endif

CXXFLAGS = -Wall $(OPTIMIZE_FLAG)

all: test

test: test.o source1.o source2.o
        $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

Makefile.depend: *.h *.cc Makefile
        $(CC) -M *.cc > Makefile.depend

clean:
        \rm -f test *.o Makefile.depend

-include Makefile.depend

这是我的问题:

  1. 虽然没有明确说明,但在编译期间是否在此 Makefile 中未显示隐式规则使用的 $(CXXFLAGS) 以生成目标文件?

  2. 我也想知道为什么$(CXXFLAGS)会出现在联动阶段?我认为它仅适用于编译阶段?我可以从“$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)”中删除 $(CXXFLAGS) 吗?如果我错了,这是否意味着 g++ 也会生成调试信息并在链接时进行优化?

  3. 为什么将 -ggdb3 -O3 一起用于非调试目的?它的目的是什么?如果只是考虑提高速度,那么使用-O3不是更好吗?

  4. 出于调试目的,一起使用 -ggdb3 -fno-omit-frame-pointer 会比单独使用 -ggdb3 做得更好吗?我试图通过阅读 gcc 文档来理解 -fno-omit-frame-pointer 的目的,但仍然感到困惑。

  5. 我可以将“-include Makefile.depend”移动到“$(CC) -M *.cc > Makefile.depend”下方和“clean”上方吗?它在 Makefile 中的位置重要吗?

【问题讨论】:

    标签: debugging optimization makefile linker compilation


    【解决方案1】:

    CXXFLAGS 被隐式规则使用。执行 make -n -p 以查看 Make 从其内部规则集和 make 文件生成的变量和规则的完整列表。

    -g 调试选项仅在编译阶段使用。 -O 选项可能在编译和链接阶段使用。您可以同时使用两者。从我的 gcc 手册页:

    GCC 允许您将-g 与-O 一起使用。 优化代码采用的捷径 可能偶尔会产生令人惊讶的 结果: 您声明的某些变量可能根本不存在;控制流 可能会短暂地移动到你没有移动的地方 期待它;一些 语句可能不会被执行,因为它们计算常量 结果或它们的值已经 在眼前;一些州—— ments 可能在不同的地方执行,因为它们是 移出循环。

    尽管如此,调试优化输出被证明是可能的。 这使得使用 可能存在错误的程序的优化器。

    -fno-omit-frame-pointer 实际上减少了优化。优化可能会干扰调试,并且编写此 makefile 的人显然打算在优化的代码上运行调试器。如果您从 gcc 手册中不清楚它是如何工作的,您可能想在某个星期六坐下来阅读 Intel 或 AMD 架构参考手册,了解指令级别的函数调用和参数传递。 (话又说回来,也许不是。:))

    在 Makefile 中位置很重要。我会在最后留下那个包含文件。否则可能会破坏包含文件的依赖关系检查。

    【讨论】:

    • 谢谢!您的意思是“-ggdb3 -O3”旨在在优化代码上运行调试器吗?对于非调试目的,“-ggdb3 -DDEBUG -fno-omit-frame-pointer”不涉及优化,那么如果没有优化代码,为什么“-fno-omit-frame-pointer 实际上减少了优化”?
    • 我不能肯定。不能保证这个 makefile 是完全一致的。也许这组标志是另一个更改留下的,或者编写它的人没有完全理解它们的含义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多