uc2day01静态动态头文件

 

调用静态库:
 查看二进制目标文件中的函数:nm 二进制目标文件
 1。库名:lib库名.a
 gcc 源代码 -o 输出文件 -l库名  -L库所在的路径
1.动态库的连接与调用
 1.编译动态库
 gcc -c -fpic 源代码   //-fpic 于代码位置无关的
 gcc -shared -o 输出文件 目标文件  //gcc -shared -olibmydll.so tool.o ap.o
//-shared 表示该东东是 需要别人调用的,而不是可执行的。 -shared表示不去找main函数。
 
 2.调用动态苦
 
补充:动态库加载于调用2种方式
 1。手工
 2。系统自动调用
  1。找到库文件
   先在/lib下面找,找不到再在/usr/lib找,最后在环境变量LD_LIBRARY_PATH指定的路径下找 mistarena2009
  2。找到函数

如果在目录中搜索,则速度非常慢:解决办法:使用缓冲保存so文件索引。如果需要则刷新缓冲区。
/sbin/ldconfig -vn要缓冲的存在这个文件中。
命令:
ldconfig -v 刷新所有的路径的缓冲哦
ldconfig -vn 指定要刷新的目录

作业:1。输入一个整数,判定是否是数组:要求:封装整数的输入 ,封装素数的判定  技术:1。静态库封装 2。共享库封装
  2。使用共享库技术来实现:输入一个整数打印实心的菱形。
  
=========================================================
1。头文件作用及工作原理:
 实验:什么时候需要头文件
  C语言中:
  1.gcc 1.c 2.c -o main   //1.c中调用了2.c中的函数,但是没有include 2.c,这样是可以的。
  结论:函数调用的时候头文件不是必须的。 可以同时编译多个文件
  C++语言中:
   函数的调用头文件是必须的
  结论:函数调用的时候在C中声明是可选的,c++中声明是必须的。
  (c++中规定,任何变量和函数:必须要声明以后才能使用。强类型的语言)
  (C是弱类型语言,对头文件的要求只于编译有关,与连接时是无关的。只是语法要求这个要求是语言标准中规定)
  即使C中不#include<stdio.h>也可以,直接声明int printf(const char*,...);
  结论:
   头文件的主要作用是用户提供声明。
   建议:我们写函数的时候先声明,在定义。
    我们的函数的声明与定义,最好分开。(可以反复使用的好处,头文件不参与编译,是为了证明这个函数是定义过的)
    
  -I 专门指定编译器查找头文件的目录。
   编译器的头文件默认搜索目录是我们的/usr/include(系统目录) 与 /usr/include/C++目录(c++标准目录)
   
  1。2: extern "C" int printf(const char* ,...);
    extern "C" {语句;}; 对花括号中有效;extern “C” 函数声明;对该函数有效
   作用2种情况:1。函数编译连接       2。函数调用
    extern "C" :去c库中找该函数
  结论:
   c++的编译器对函数明在编译的时候会按照某种规则重命名 其中包括函数名长度,函数名,函数类型缩写,nm a.o   (c) nm b.o (C++):C不支持重载,c++支持重载。extern "C" 保证我们的函数编译按照c的规则来命名。
  (在不同的编译起中函数的命名规则是不一样的。)
2。gcc -x c 1.cpp 2.cpp 用c的编译方式来编译这2个文件。  

 


 

你可能感兴趣的:(uc2day01静态动态头文件)