贡献者: addis
/usr/bin/gcc
和 /usr/bin/g++
symlink 的版本! 因为一些安装过程(例如 cuda)需要 gcc
编译 kernel module,必须使用默认版本。如果已经改变了,就卸载 gcc
和 g++
,再重装一次就行。
-I <dir>
选项可以声明 .h 所在的目录
-c
选项只编译不 link
g++ -c <other flags> <dir1>/1.cpp <dir2>/2.cpp 3.cpp 4.cpp.....
/usr/local/include/
下的头文件
-D 宏
定义宏
-O3
是最优化,-g
是调试,如果不调试,需要手动定义 -D NDEBUG
-g
不包含一些信息如宏定义,需要用 -g3
,要打出 Macro 的位置和定义,用 info macro 宏名
main()
函数开始,如果有未定义的 symbol 就留到以后再找,而把没有用的 symbol 抛弃。这样能提高效率。
g++ hello.cpp -L. -( -la -lb -)
。-(...-)
是 --start-group ... --end-group
的简写。
g++ main.cpp -fsanitize=address -static-libasan -g
。注意仅适用于动态编译。
-ftrapv
,亲测支持 int, long, long long
(其他类型貌似不行),运行时会终止程序,可以用 gdb 找到位置,不能在程序中 catch
。如果想支持所有整数类型,可以用 SafeInt
库。
g++
的默认输出是 stderr 而不是 stdout,所以如果 pipe 的时候要指定 stderr
g++
在链接阶段就是调用 ld
命令,也就是 GNU Linker
ld -o my_program file1.o file2.o -L/path/to/libs -lmylib -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2
--allow-multiple-definition
(危险)会忽略错误并使用第一个看到的定义。
-L
指定添加 -l
的搜索路径
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
可以查看 linker
的默认搜索路径
g++ -E -P xxx.cpp > out.txt
会显示 preprocessor 的输出,其中 -P
会删掉 linkmarker(用于显示代码在头文件中来源)
g++ -E -dM xxx.cpp > out.txt
会输出所有 Macro 的定义,每行一个(但并没有定义的位置)。
[-Wxxx]
,如果不需要警告,就用 -Wno-xxx
。
#if GCC_VERSION > 30200
可以要求 GCC 版本大于 3.2.0。其中 3 是 __GNUC__
,2 是 __GNUC_MINOR__
, 0 是 __GNUC_PATCHLEVEL__
。
CPATH
是搜索头文件的路径。相当于 -I
选项。
LIBRARY_PATH
是编译时搜索库文件的路径。相当于 -L
选项。
LD_LIBRARY_PATH
是运行时搜索动态链接库的路径。相当于 rpath
(详见 “g++ 编译器创建静态和动态链接库”)。
g++
的默认标准是 -std=gnu++17
这是 -std=c++17
加上 GNU 的一些拓展。
-ansi 或 -std=c++98 或 -std=c++03
,-std=c++11或14或17或20
-pedantic
给出警告,或者 -pedantic-errors
给出错误。
g++ -H xxx.cpp
可以列出所有头文件的路径,尤其是 #include <...>
中的有时候很难判断用的是哪里的头文件另见(CPATH
环境变量和 -I
选项)。
g++
的 -MM
选项可以生成某个 cpp 文件或者 h 文件的所有依赖(包括依赖的依赖)。-MM -nostdinc++
则可以在依赖中去掉标准库中的头文件。
g++
的 -M
选项也一样,但会生成多条依赖关系,每个依赖关系只包含直接依赖。