调用静态库:
查看二进制目标文件中的函数: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个文件。