贡献者: 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 选项也一样,但会生成多条依赖关系,每个依赖关系只包含直接依赖。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利