C语言图文并茂详解链接过程

  一、链接器的意义

  连接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。

  二、模块链接

  静态链接

  由链接器在链接时将库的内容直接加入到可执行程序中

  Linux下静态库的创建和使用

  下面看一段静态链接示例的代码:

  slib.c

  char* name()

  {

  return "Static Lib";

  }

  int add(int a, int b)

  {

  return a + b;

  }

  Test.c

  #include

  extern char* name();

  extern int add(int a, int b);

  int main()

  {

  printf("Name: %s

  ", name());

  printf("Result: %d

  ", add(2, 3));

  return 0;

  }

  输入,编译静态库源码:

  输入,生成静态库文件:

  输入,使用静态库编译,生成 .out 文件:

  然后输入 ,就可以运行了,如下:

  如果把 slib.o,slib.a 文件全部删除,运行 http://m.jb51.net/article/Test.out,发现能正常运行,这就是前面说的 .o 文件和 .a 文件完全被链接进了可执行程序里面,可执行程序的运行跟 .o 文件和 .a 文件没有任何关系。

  动态链接

  Linux下动态库的创建和使用

  编译动态库源码:gcc -shared dlib.c -o dlib.so

  使用动态库编译:gcc main.c -ldl -o main.out

  关键系统调用

  下面看一个动态链接示例:

  dlib.c

  char* name()

  {

  return "Dynamic Lib";

  }

  int add(int a, int b)

  {

  return a + b;

  }

  Demo.c

  #include

  #include

  int main()

  {

  void* pdlib = dlopen("http://m.jb51.net/article/dlib.so", RTLD_LAZY);

  char* (*pname)();

  int (*padd)(int, int);

  if( pdlib != NULL )

  {

  pname = dlsym(pdlib, "name");

  padd = dlsym(pdlib, "add");

  if( (pname != NULL) && (padd != NULL) )

  {

  printf("Name: %s

  ", pname());

  printf("Result: %d

  ", padd(2, 3));

  }

  dlclose(pdlib);

  }

  else

  {

  printf("Cannot open lib ...

  ");

  }

  return 0;

  }

  先输入 ,编译动态库源码:

  再输入,使用动态库编译,生成 .out 文件:

  然后输入 ,就可以运行了,如下:

  如果把 dlib.so 给删了,运行就会报错:

  所以dlib.so 这个库文件是在程序的运行阶段被动态加载到内存中去,这就是与静态链接的区别。

  三、小结

  链接是指将目标文件最终链接为可执行程序

  根据链接方式的不同,链接过程可以分为:

  到此这篇关于C语言图文并茂详解链接过程的文章就介绍到这了,更多相关C语言 链接过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  您可能感兴趣的文章: