make小tip
总所周知make
一般需要Makefile
才能编译相关源码,但也可以无需Makefile
就能编译一些简单的源代码。
在算法竞赛里,一道题的源程序一般只有一个文件,此时用Makefile
显得十分累赘,但如果输入一段长长的编译指令又很费时间
g++ a.cpp -o a
有时,为了使用新特性而要使用较新标准的C++标准,亦或者增加调试信息或者开Wall
,此时应该输入
g++ a.cpp -std=c++17 -g -Wall -o a
显得十分的长且费时。幸运的是,make
有个默认的编译配置,在MacOS
中,我只要输入
make a
# make magically runs 'c++ a.cpp -o a'
它会默认调用c++
编译器进行编译源码a.cpp
,而无需我输入那一长串的编译命令。
但由于我想修改这个默认配置,也即采用C++ 17
标准,增加其他的一些C++ flag
(比如-g -Wall -Dqwq
),或者增加静态库动态库链接,甚至修改编译器为g++
。这些可以通过增加环境变量进行修改。
编辑~/.bash_profile
(或者~/.bashrc, ~/.zshrc
,取决于自己所用的终端),添加以下环境变量
export CC="gcc"
export CXX="g++"
export LDFLAGS="-L/opt/homebrew/opt/llvm/bin"
export CPPFLAGS="-I/opt/homebrew/opt/llvm/include"
export CXXFLAGS="-std=c++17 -g -Wall"
export CFLAGS="-std=c17 -g -Wall"
依此下来,
CC
配置C
编译器CXX
配置C++
编译器LDFLAGS
配置动态链接库地址CPPFLAGS
配置Flag,对C
和C++
都生效CXXFLAGS
配置Flag,仅对C++
生效CFLAGS
配置Flag,仅对C
生效
重新source
下配置文件或者重启终端后,再次输入make a
编译a.cpp
就会得到
make a
# make runs 'g++ -std=c++17 -g -Wall -I/opt/homebrew/opt/llvm/include -L/opt/homebrew/opt/llvm/bin a`.cpp -o a'
如果是a.c
则是
make a
# make runs 'gcc -std=c17 -g -Wall -I/opt/homebrew/opt/llvm/include -L/opt/homebrew/opt/llvm/bin a.c -o a'
这正是我们需要的,于是当用命令行编译单个文件时,我们仅需要输入make <sourceCode>
就可以了!
以上方法适用于Linux
和MacOS
,Windows
的话应该在系统环境变量里添加上述环境变量名和对应的值,重启下终端就可以了。
当然,配置的编译器gcc
和g++
也要确保在环境变量中,或者输入gcc
或g++
的绝对路径也可以。