C 使用不带调试符号的GDB

C 使用不带调试符号的GDB,c,debugging,gdb,C,Debugging,Gdb,假设以下代码: #include <iostream> void test(){ // } int main(){ return 0; } 这是你错过的 C++是围绕编译和链接的概念构建的。因此,在编译阶段,编译器假定当前文件只是更复杂程序中的一个文件,最终将链接在一起 当你写作时: void test(){ // } 编译器别无选择,只能假设test将由另一个源文件中的代码调用,并将其编译到一个单独的.o文件中。因此,尽管没有定义调试符号,它还是会导出test的符号

假设以下代码:

#include <iostream>

void test(){
 //
}

int main(){
 return 0;
}

这是你错过的

C++是围绕编译和链接的概念构建的。因此,在编译阶段,编译器假定当前文件只是更复杂程序中的一个文件,最终将链接在一起

当你写作时:

void test(){
 //
}
编译器别无选择,只能假设
test
将由另一个源文件中的代码调用,并将其编译到一个单独的
.o
文件中。因此,尽管没有定义调试符号,它还是会导出
test
的符号

要查看实际效果,请尝试以下操作。首先,将
test
标记为static。如果使用优化进行编译,您将看到
test
gdb
不再可见。事实上,它甚至不再被定义。编译器将其内联起来


实现这一点的另一种方法是通过传递
g++
-fwhole程序
选项。此选项告诉gcc假设当前正在编译的文件是整个程序,不存在其他编译单元。这使得它可以有效地将所有函数和全局定义视为静态的。同样,一旦打开优化,您将看到
test
gdb

不再可见

C++是围绕编译和链接的概念构建的。因此,在编译阶段,编译器假定当前文件只是更复杂程序中的一个文件,最终将链接在一起

当你写作时:

void test(){
 //
}
编译器别无选择,只能假设
test
将由另一个源文件中的代码调用,并将其编译到一个单独的
.o
文件中。因此,尽管没有定义调试符号,它还是会导出
test
的符号

要查看实际效果,请尝试以下操作。首先,将
test
标记为static。如果使用优化进行编译,您将看到
test
gdb
不再可见。事实上,它甚至不再被定义。编译器将其内联起来


实现这一点的另一种方法是通过传递
g++
-fwhole程序
选项。此选项告诉gcc假设当前正在编译的文件是整个程序,不存在其他编译单元。这使得它可以有效地将所有函数和全局定义视为静态的。同样,一旦打开优化,您将看到
test
gdb

是不再可见。查看带有nm的全局符号。使用类似这样的方法:nma.out | c++filt | grep“T”Yes。查看带有nm的全局符号。使用类似这样的代码:nma.out | c++filt | grep“T”