Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:cpp:编译器

C / C++ 编译器

cc是什么?

你可能在某些地方能看到使用cc编译c源码,使用c++编译c++源码,那么cc和c++是什么编译器呢?实际上:cc 和 c++ 是指向编译器的链接(也称为符号链接或别名),而不是实际的编译器程序。它们一般指向系统中安装的 C 或 C++ 编译器的实际可执行文件。(比如 gcc 和 g++ )

C / C++编译器的 Include 和 Lib 路径

以Mac / g++为例
如何知道我的编译器在正在哪些目录中寻找 header 和 lib 呢?

Include

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)

那么这句有点奇怪的命令是什么意思呢?

  1. 关于前面的echo:“echo 是一个命令,用来输出文本字符串。echo | 表示将空的输入(因为 echo 后没有内容)通过管道 | 重定向为输入传递给下一个命令,即 g++”。
  2. 关于 g++ 的参数:-v 详细模式(所以才会输出编译的log);-x c++ 指定语言;-E 只运行预处理器(引入头文件就是在预处理的时候)。
  3. 关于最后的-:“在命令行中,- 作为特殊的文件名,表示从标准输入(stdin)读取输入。结合 echo |,这意味着编译器实际上读取的是一个空输入。”

相当于是:让 g++ 以 c++ 模式预处理一个空文件,开启log,就能看到找 Include 的过程了

Lib

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 ...
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/cpp/编译器.txt · Last modified: 2024/12/12 18:13 by zhonghui