源码编译clang编译器-从命令行编译C++(Linux下、Windows下)

C++编译过程

一般来说,C++程序编译分为4个阶段:

Linux系统

参考《GCC简介》

使用 gcc(GNU 编译器套件)

gcc最开始是GNUC Compiler,也就是ac编译器。 而后来,因为这个项目中集成了更多不同语言的编译器,GCC代表的是GNUCompilerCollection源码编译clang编译器,所以它的意思是编译器的集合。 g++是GCC的c++编译器。

现在调用gcc时,它不再是过去的c语言编译器了。 更准确地说,它是一个驱动程序源码编译clang编译器,根据代码的后缀名来确定是调用c编译器还是c++编译器(g++)。 即如果代码后缀是.c,那么就会调用c编译器和链接器来链接c库; 如果代码后缀是.cpp,则会调用g++编译器,这里gcc不会手动链接c++库。

$ gcc *.o -lstdc++
$ ls
a.out        Factory.h  main.cpp  Product.cpp  Product.o
Factory.cpp  Factory.o  main.o    Product.h
$ ./a.out
Concrete Facotry
Concrete Product...

$ g++ *.o
$ ls
a.out        Factory.h  main.cpp  Product.cpp  Product.o
Factory.cpp  Factory.o  main.o    Product.h
$ ./a.out
Concrete Facotry
Concrete Product...

综上所述,可以直接使用g++编译链接c++程序生成可执行文件

$ g++ *.cpp
$ ls
a.out  Factory.cpp  Factory.h  main.cpp  Product.cpp  Product.h
$ ./a.out
Concrete Facotry
Concrete Product...

include包含文件搜索路径

编译时使用include文件,GCC搜索头文件路径的顺序:

当前目录(#include "" 方法会搜索当前目录,#include 方法不会搜索当前目录) -I 选项指定的目录 gcc 环境变量 CPLUS_INCLUDE_PATH 指示的目录(c 程序使用 C_INCLUDE_PATH )

gcc的默认目录

/usr/local/include
/usr/include
/usr/lib/x86_64-linux-gnu/5.4.0/include

gcc的默认目录不是由$PATH环境变量指定的,而是由g++的配置前缀指定的。

lib库文件搜索路径

链接时使用,搜索顺序:

-I(小写i)、-include、-L、-l(大写L)参数说明 -共享参数说明

用于编译生成动态库。

Windows系统

cl.exe 和 link.exe 分别是 Visual Studio IDE 中的编译器和链接器。

使用 cl.exe 编译器

例子:

Windows下命令中使用路径时,注意特殊字符使用通配符“”。 以下路径包含、空格和括号,请在其中添加通配符“”,或者用冒号将路径括起来。

gitbash 窗口:

    $ cl *.cpp -c -EHsc -I C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include -I C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt
    # or
    $ cl *.cpp -c -EHsc -I "C:Program Files (x86)Windows Kits10Include10.0.10240.0ucrt" -I "C:Program Files (x86)Microsoft Visual Studio 14.0VCinclude"

使用 link.exe 链接器

usage: LINK [options] [files] [@commandfile]

例子:

windowscmd窗口(在bash下测试):

$ link *.obj /LIBPATH:"C:Program Files (x86)Microsoft Visual Studio 14.0VClib" /LIBPATH:"C:Program Files (x86)Microsoft SDKsWindowsv7.1ALib" /LIBPATH:"C:Program Files (x86)Windows Kits10Lib10.0.10240.0ucrtx86" /OUT:fac.exe

编译器控制的 LINK 选项