你可能在某些地方能看到使用cc编译c源码,使用c++编译c++源码,那么cc和c++是什么编译器呢?实际上:cc 和 c++ 是指向编译器的链接(也称为符号链接或别名),而不是实际的编译器程序。它们一般指向系统中安装的 C 或 C++ 编译器的实际可执行文件。(比如 gcc 和 g++ )
以Mac / g++为例
如何知道我的编译器在正在哪些目录中寻找 header 和 lib 呢?
echo | g++ -v -x c++ -E -
我们能在输出中找到以下内容,很容易看到我们的 Include 路径了:
... ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/local/include" ignoring nonexistent directory "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Library/Frameworks" ... #include "..." search starts here: #include <...> search starts here: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1 /Library/Developer/CommandLineTools/usr/lib/clang/16/include /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include /Library/Developer/CommandLineTools/usr/include /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
那么这句有点奇怪的命令是什么意思呢?
相当于是:让 g++ 以 c++ 模式预处理一个空文件,开启log,就能看到找 Include 的过程了
g++ -print-search-dirs
同样,我们可以在输出中找到当前的 Lib 路径
programs: =/Library/Developer/CommandLineTools/usr/bin libraries: =/Library/Developer/CommandLineTools/usr/lib/clang/16
如何添加 Include 和 Lib 路径呢?
使用环境变量(可以配置到自己用户的 ~/.bashrc里面 Linux的环境变量)(尚未验证)
export CPLUS_INCLUDE_PATH=/path/to/extra/includes:$CPLUS_INCLUDE_PATH export LIBRARY_PATH=/path/to/extra/libs:$LIBRARY_PATH
使用编译参数(可以写在Makefile里面)
g++ -I/path/to/extra/includes ... g++ -L/path/to/extra/libs ...