gcc 和g++是GNU 的编译器
1.gcc 和g++编译程序主要分为四个步骤
<1>预处理,生成 .i文件
<2>编译,根据文件名后缀,确定编译方式,(.c,.cpp,.cxx),生成 .s文件
<3>汇编,将.s 文件转换成.o文件(目标文件)
<4>链接,对目标文件进行链接
2.gcc 和g++的区别
<1>gcc 主要用于编译c文件,g++主要用于编译c++文件。
<2>gcc 在碰到.c文件时,按照C 文件方式编译,碰到.cpp 时按照C++文件编译,g++在碰到.c 和.cpp文件时都按照C++文件编译。
<3>gcc 也可以编译cpp 文件,但是它无法链接C++的各种库。g++在编译的时候,会调用gcc,也就是说g++的编译汇编工作都是交给gcc 来完成的,链接是由自己完成的。
<4>gcc 不会定义_cplusplus的宏,g++会,所以gcc 编译.c文件时,_cplusplus是没有被定义的。
3.GNU编译器的主要参数
<1>不带任何参数,默认生成.out 文件(可执行文件).
g++ main.cpp //gcc 无法链接
<2> -c 编译后汇编,或者将.s文件进行汇编,生成目标文件,不进行链接。
gcc -c test.cpp -o test.o
gcc -c test.s -o test.o
<3> -S 编译后不进行汇编,生成.s文件
gcc -S test.cpp -o test.s
<4> -o 输出文件,输出的可以是可执行文件(可以重命名),.s 文件,.i文件,.o文件
<5> -E 生成预处理文件(.i),只进行预处理。
gcc -E test.cpp -o test.i
<6> -shared 编译生成动态链接库
gcc -shared -fPIC test.cpp -o libtest.so
-fPIC,表示生成跟位置无关的代码
<7> -L. 表示需要链接的库就在当前目录
<8> -llibname ,表示要链接的库的名称,libname是库名除去lib前缀以及扩展名后的字符,如libtest.so ,那么就是 -ltest
<9> -I(大写的I),添加头文件搜索目录 ,如-I. 当前目录,-I/home/peter/temp
<10> -I-,用在-I的后面可以将当前目录从头文件搜索目录中除去
<11> -static 强制链接静态库
gcc test.c -shared -fPIC -o libtest.so -L. -static -ltest2 //智能链接 libtest2.a
4.创建静态库
静态库只是一系列目标文件的集合。
ar cr test.o libtest.a test.o
5.创建动态库
gcc test.c -shared -fPIC -o libtest.so
6.动态库和静态库的区别
<1> 静态库是包含在可执行文件中的,动态库不包含在可执行文件中的,只要当可执行文件运行时,才会的动态加载动态库。
1.gcc 和g++编译程序主要分为四个步骤
<1>预处理,生成 .i文件
<2>编译,根据文件名后缀,确定编译方式,(.c,.cpp,.cxx),生成 .s文件
<3>汇编,将.s 文件转换成.o文件(目标文件)
<4>链接,对目标文件进行链接
2.gcc 和g++的区别
<1>gcc 主要用于编译c文件,g++主要用于编译c++文件。
<2>gcc 在碰到.c文件时,按照C 文件方式编译,碰到.cpp 时按照C++文件编译,g++在碰到.c 和.cpp文件时都按照C++文件编译。
<3>gcc 也可以编译cpp 文件,但是它无法链接C++的各种库。g++在编译的时候,会调用gcc,也就是说g++的编译汇编工作都是交给gcc 来完成的,链接是由自己完成的。
<4>gcc 不会定义_cplusplus的宏,g++会,所以gcc 编译.c文件时,_cplusplus是没有被定义的。
3.GNU编译器的主要参数
<1>不带任何参数,默认生成.out 文件(可执行文件).
g++ main.cpp //gcc 无法链接
<2> -c 编译后汇编,或者将.s文件进行汇编,生成目标文件,不进行链接。
gcc -c test.cpp -o test.o
gcc -c test.s -o test.o
<3> -S 编译后不进行汇编,生成.s文件
gcc -S test.cpp -o test.s
<4> -o 输出文件,输出的可以是可执行文件(可以重命名),.s 文件,.i文件,.o文件
<5> -E 生成预处理文件(.i),只进行预处理。
gcc -E test.cpp -o test.i
<6> -shared 编译生成动态链接库
gcc -shared -fPIC test.cpp -o libtest.so
-fPIC,表示生成跟位置无关的代码
<7> -L. 表示需要链接的库就在当前目录
<8> -llibname ,表示要链接的库的名称,libname是库名除去lib前缀以及扩展名后的字符,如libtest.so ,那么就是 -ltest
<9> -I(大写的I),添加头文件搜索目录 ,如-I. 当前目录,-I/home/peter/temp
<10> -I-,用在-I的后面可以将当前目录从头文件搜索目录中除去
<11> -static 强制链接静态库
gcc test.c -shared -fPIC -o libtest.so -L. -static -ltest2 //智能链接 libtest2.a
4.创建静态库
静态库只是一系列目标文件的集合。
ar cr test.o libtest.a test.o
5.创建动态库
gcc test.c -shared -fPIC -o libtest.so
6.动态库和静态库的区别
<1> 静态库是包含在可执行文件中的,动态库不包含在可执行文件中的,只要当可执行文件运行时,才会的动态加载动态库。