在Linux服务器上敲gcc编译C++代码,报一堆undefined reference to std::cout,多半是用错了命令。两者都能编译C++源码,但g++会自动链接C++标准库,省去手动加-lstdc++的麻烦。
从安装到第一个可执行文件
Ubuntu下装编译环境一条命令:sudo apt install build-essential,装完用g++ --version确认版本,Debian系和红帽系包名不同,认准GCC套件即可。版本最好在9以上,C++17的新特性基本都支持。Windows上常用MinGW-w64,或者直接装MSYS2。
最基础的用法:
g++ main.cpp -o hello
-o后面跟输出的可执行文件名,不写的话Linux下默认生成a.out。
这几个参数最常用
- -std=c++17:指定语言标准,老机器可能只认c++11,编译新特性代码报错先查这里。
- -O2:二级优化,发布版本常用;-O0不优化,调试时配-g用。
- -Wall -Wextra:打开大部分警告,能提前暴露未初始化变量这类隐患。
- -I和-L:分别指定头文件和库文件搜索路径,接第三方库离不开。
两个进阶动作:加-c参数只编译不链接,生成.o目标文件,排查链接错误时常用;加-shared和-fPIC能生成动态库so文件。多文件工程直接把所有.cpp列在命令后面也能编,文件一多就该换Makefile或CMake,编译器负责单个编译单元,构建系统负责调度。
报错排查的两个习惯
编译报错从第一条看起,后面的错误经常是第一条连带出来的,改一处重新编译比一口气猜十处靠谱。头文件改了但只重编了部分文件,链接出来的程序行为很怪,拿不准就全量重编。配合gdb调试记得带-g参数,不加的话断点定位不到源码行,这是新手最容易忘的一件事。日常刷算法题用g++ a.cpp -std=c++17 -O2 -o a这一套组合就够了。