Linux gcc编译过程

一、C语言gcc编译过程:

.c/*源代码文件*/
.h/*C语言头文件*/
.i/*经过预处理之后的源代码文件*/
.s/*汇编代码文件*/
.o/*目标代码文件(二进制机器指令文件)*/
.a/*静态对象库文件*/
.so/*共享(动态)对象库文件*/



一个程序的编译到运行gcc file.c执行了什么?其文件类型有何变化?如下图所示,最终我们只能看到a.out这个可执行文件:

è¿éåå¾çæè¿°

 

Linux gcc编译过程_第1张图片

*****************************************************************************************
练习:test.c
#include 
int main(){
  printf("Test !\n");
  return 0;
}
*****************************************************************************************
1.预处理:把.c和.h文件生成.i文件
# gcc –E hello.c –o hello.i

注意:预处理把stdio.h中不管有关没关的内容都进了main.i文件之中。

2.汇编:把预处理.i文件生成汇编文件.s
# gcc –S hello.i –o hello.s

3.目标文件:把汇编文件.s生成目标文件.o
# gcc –c hello.s –o hello.o

4.链接: 把目标文件.o生成可执行文件(动态库 OR 静态库)
<1>.编译可执行文件
# gcc hello.o -o hello //可执行文件

or其他用法
# gcc test.c -L/path -lxxx -o test

<2>.编译动态库
# gcc -fPIC -shared file1.c -o libxxx.so

也可分成两部:
# gcc -fPIC test.c -c //这一步生成file1.o
# gcc -shared test.o -o libtest.so
注意:运行程序的时候,需要指定动态库的位置,可以环境变量来指定,export LD_LIBRARY_PATH=path,否则会提示找不到动态库的位置.

<3>.编译静态库
# ar cr libxxx.a test1.o test2.o

二、C/C++函数宏定义使用

1.相关宏定义
__LINE__ /*显示所在行,%d输出*/
__FILE__ /*当前文件名,%s输出*/
__DATE__ /*当前日期,%s输出*/
__TIME__ /*当前时间,%s输出*/
__FUNCTION__ /*所在函数名,%s输出*/

2.使用test.c
#include 
int main(){
  printf("%s, %s(), %d, %s, %s\n",__FILE__, __FUNCTION__, __LINE__, __DATE__, __TIME__);
  return 0;
}
0.test.h
int NTFS = 10;
int NNNN = 500

1.test.c
#include 
#include "test.h"
int print(){
  printf("NTFS = %d\n", NTFS);
  printf("NNNN = %d\n", NNNN);
  return 0;
}
编译so
# gcc -fPIC  -shared test.c -o libtest.so

2.调用
main.c
include 
#include 
#include 

typedef int (*PRINT)();

int main(){
  void *handle=dlopen("./libtest.so",RTLD_LAZY);
  PRINT print=NULL;

  *(void **)(&print)=dlsym(handle,"print");
  print();
  return 0;
}

编译测试程序:
#  gcc main.c -L ./ -ltest -o main -ldl
# ./main
NTFS = 10
NNNN = 500
注意:说明test.h已经编译到libtest.so里.

 

你可能感兴趣的:(linux,基础知识,C语言基础)