g++编译选项顺序及Makefile场景下-fno-omit-frame-pointer生效性疑问
Let's tackle these two questions one by one—they're closely linked around how g++ processes command-line flags and how Make builds its compiler flag variables.
Question 1: Does -fno-omit-frame-pointer work if specified before -O2 or -O3 in g++?
Nope, not in the way you want it to. Here's why:
g++ processes flags in the exact order they appear on the command line. Optimization levels like -O2 and -O3 set a whole suite of default sub-flags, including -fomit-frame-pointer. If you pass -fno-omit-frame-pointer first, then -O2, the -O2 will overwrite that earlier setting and re-enable -fomit-frame-pointer.
The key rule here is: later flags override earlier conflicting ones. So to make -fno-omit-frame-pointer stick with -O2/-O3, you need to put it after the optimization level flag, like this:
g++ -O2 -fno-omit-frame-pointer myfile.cpp
Question 2: In our layered Makefile system, if -fno-omit-frame-pointer is set first (main Makefile) then -O2 is added later (sub-Makefiles), does the last flag win?
Exactly—this is a direct extension of the g++ flag rule, combined with how Make handles variable appends.
When you use CXXFLAGS += ... in Make, each append adds to the end of the variable. So if your main Makefile (included by all sub-Makefiles) sets:
CXXFLAGS += -fno-omit-frame-pointer
Then a sub-Makefile adds:
CXXFLAGS += -O2
The final CXXFLAGS passed to g++ will be -fno-omit-frame-pointer -O2. As we covered in question 1, the -O2 comes last and will enable -fomit-frame-pointer, undoing your earlier setting.
To fix this, you need to ensure -fno-omit-frame-pointer is the last flag in the final CXXFLAGS. In your setup, since sub-Makefiles include the main one first, you have a few practical options:
- Add
-fno-omit-frame-pointerat the end of each sub-Makefile after appending-O2(not ideal if you have many sub-Makefiles) - Create a "post-processing" variable in the main Makefile that sub-Makefiles append at the end, like:
# In main.mk POST_CXXFLAGS = -fno-omit-frame-pointer # In each sub-Makefile, after adding your flags: CXXFLAGS += $(POST_CXXFLAGS) - Explicitly combine the flags in sub-Makefiles: use
-O2 -fno-omit-frame-pointerinstead of just-O2
The core takeaway here is consistent with question 1: the order of flags in the final g++ command is everything—later conflicting flags always override earlier ones.
内容的提问来源于stack exchange,提问作者Krishna

