[C++基础]gcc的基本用法

gcc是GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pascal 等

使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要

gcc所遵循的部分约定规则:

  1. .c为后缀的文件,C语言源代码文件;
  2. .a为后缀的文件,是由目标文件构成的档案库文件;
  3. .C,.cc或.cxx 为后缀的文件,是C++源代码文件;
  4. .h为后缀的文件,是程序所包含的头文件;
  5. .i 为后缀的文件,是已经预处理过的C源代码文件;
  6. .ii为后缀的文件,是已经预处理过的C++源代码文件;
  7. .m为后缀的文件,是Objective-C源代码文件;
  8. .o为后缀的文件,是编译后的目标文件;
  9. .s为后缀的文件,是汇编语言源代码文件;
  10. .S为后缀的文件,是经过预编译的汇编语言源代码文件。

gcc的编译过程

[C++基础]gcc的基本用法_第1张图片

  • 预处理(pre-processing)E:插入头文件,替换宏,预处理成xxx.i源文件
  • 编译(Compiling)S:编译成xxx.s的汇编文件
  • 汇编(Assembling)c:汇编成xxx.o的目标文件
  • 链接(Linking):链接到库中,变成可执行文件,在命令行中./xx就可以执行可执行文件

gcc常用选项

用法:gcc [options] [filenames] ;可使用gcc -help来查看其所有选项
//test.c文件
#include 
int main(void)  
{  
   printf("\n Hello World\n");  
   return 0;  
} 

1.基础选项

  • o   生成目标,输出生产file文件;gcc test.c -o test,执行预处理、编译、汇编、链接步骤后生成执行文件,并把中间文件给删除了;可以写个makefile文件
  • c 只执行预处理、编译、汇编步骤,取消链接步骤,编译源码并最后生成xxx.o目标文件;gcc -c test.c [-o test.o]--[]内的可以加也可以不加
  • S 只执行预处理、编译步骤,取消汇编、链接步骤,生成xxx.s汇编语言文件;gcc -S test.c [-o test.s]
  • E 只执行预处理步骤,只运行C预编译器(头文件,宏等展开);gcc -E test.c [-o test.i]

2.调试选项

  • -v 显示所有编译步骤的调试信息
  • save-temps 输出所有的中间编译代码;gcc -save-temps test.c,生成test.i、test.s、test.o、a.out
  • 嵌入调试信息,方便gdb调试;gcc -g test.c,生成a.out、a.out.dSYM(Mac电脑)

3.库路径选项

  • llib  链接 lib 库 (这里是小写 L ) 相当于 C++ #pragma comment(lib, “xxx.lib”)
  • Idir  增加 include 目录 (这里是大写 i ) 头文件路径
  • LDir  增加 lib 目录 (编译静态库和动态库)
  • Wall  让所有编译警告都显示出来

多模块编译

//hello.h文件
void hello (const char * name);

//hello.c文件
#include  
#include "hello.h" 
//语句 #include "FILE.h" 与 #include  有所不同:前者在搜索系统头文件目录之前将先在当前目录中搜索文件‘FILE.h’,
//后者只搜索系统头文件而不查看当前目录。
void hello(const char * name) 
{ 
   printf("Hello, %s!\n", name);
}

//main.c文件
#include "hello.h"
int main(void)  
{  
   hello("world");  
   return 0;  
} 
一次性编译:
   gcc -Wall hello.c main.c –o main_hello
独立编译:
   gcc –Wall –c main.c –o main.o
   gcc –Wall –c hello.c –o hello.o
   gcc –Wall main.o hello.o –o main_hello

注意到头文件‘hello.h’并未在命令行中指定。源文件中的的 #include "hello.h" 指示符使得编译器自动将其包含到合适的位置。
多模块编译中如果某一个模块发生了变化,只需要编译更改的模块即可

静态库与共享库(动态库)

静态库(.a)

程序在编译链接时候把库的代码链接到可执行文件中。程序运行时候,不再需要静态库,生成的可执行文件大,每个可执行文件都会加载一份拷贝到内存
静态库生成(libxxx.a),首先生成.o文件,然后通过.o文件生成.a文件。例如:
  gcc –c hello.c -o hello.o
  ar rcs hello.a hello.o

静态库使用

  gcc –Wall main.c hello.a –o main
  gcc –Wall –L. main.c –o main –lhello
  -L.表示在当前目录搜索libhello.a

静态库搜索路径

  • 1:编译使用选项 –L 指定的目录(建议)
  • 2:修改环境变量,搜索指定的目录,设置环境变量LIBRARY_PATH,export LIBRARY_PATH=“库目录”
  • 3:lib文件放入系统指定目录,例如/usr/lib/等

共享库(.so或.sa)

程序运行时候才去链接共享库代码,多个程序共享使用,使用时候只需要加载一份到内存
直接可以通过.c文件生成.so文件,例如:gcc –shared –fPIC hello.o –o libhello.so
shared:生成共享库格式
fPIC:产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址

使用:gcc –Wall main.o –o main –L. -lhello
只需要-l+文件名即可
配置方式

  • 1:拷贝到so文件到共享库目录 /usr/lib/
  • 2:更改 LD_LIBRARY_PATH,如果已经有了一个这样的目录,要写成export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:“库目录”这样子 如果写在profile配置文件里 export LD_LIBRARY_PA TH="目录:$LD_LIBRARY_PATH"
  • 3:配置 /etc/ld.so.conf; 并使用 ldconfig 命令进行更新

[C++基础]gcc命令之---静态库和动态库


你可能感兴趣的:(C++基础)