一,静态库的编译和qt中使用
1,代码
add.h头文件代码
#ifndef _ADD_H
#define _ADD_H
//包含其他头文件
#include <stdio.h>
//声明计算两个参数和的函数
int add_int(int,int);
#endif
add.c函数代码
#include "add.h"
//定义计算两个参数和的函数
int add_int(int ia,int ib)
{
printf("我就是静态库文件\n");
return ia + ib;
}
main.c测试代码
#include "add.h"
int main(void)
{
printf("计算的结果是:%d\n",add_int(20,30)); // 50
return 0;
}
2,生成.a静态库
只编译不链接生成目标pc文件x.o: cc -c add.c
c.生成静态库文件:ar -r/*插入*/ lib库名.a 目标文件名。这里写成ar -r pcadd.a add.o
生成arm使用的目标文件x.o:arm-linux-gnueabihf-gcc -c add.c
生成交叉编译arm用的.a静态库:arm-linux-gnueabihf-ar -r armadd.a add.o
静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。
3,调用测试
只编译不链接生成目标文件main.o:cc -c main.c
链接静态库文件生成可执行文件,链接方式有以下三种:
(1)直接链接:cc 目标文件 静态库文件名。即:cc main.o libadd.a
(2)采用编译选项进行链接:cc 目标文件 -l 库名 -L 库文件所在的路径。即:cc main.o -l add -L .
(3)通过配置环境变量LIBRARY_PATH进行链接:export LIBRARY_PATH=$LIBRARY_PATH:.
然后编译 cc main.o -l add
4,放入QT使用:注意.h是要加入进来的
.pro中加入路径: LIBS += /home/geyuxi/Documents/test_a/libadd.a

引用文件中加入头文件
extern "C"
{
#include "add.h"
}
在应用程序.cpp中调用静态函数

5,静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态链接时、执行时搜索路径顺序:
(1) 编译目标代码时指定的动态库搜索路径;
(2) 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
(3)配置文件/etc/ld.so.conf中指定的动态库搜索路径;
(4)默认的动态库搜索路径/lib;
(5)默认的动态库搜索路径/usr/lib。
有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径
二,动态库(又称共享库)的编译和qt中使用
1,代码
add.h头文件
#ifndef _ADD_H
#define _ADD_H
//包含其他头文件
#include <stdio.h>
//#include "stdio.h"
//声明计算两个参数和的函数
int add_int(int,int);
#endif
add.c函数定义
#include "add.h"
//#include <add.h>
//定义计算两个参数和的函数
int add_int(int ia,int ib)
{
printf("我是共享库文件\n");
return ia + ib;
}
main.c测试程序
#include "add.h"
//#include "../add.h"
int main(void)
{
printf("计算的结果是:%d\n",add_int(20,30));// 50
return 0;
}
2,共享库(动态库)的生成和调用步骤
只编译不链接生成目标文件xxx.o: cc -c -fpic/*小模式*/ add.c
生成共享库文件gcc/cc -shared/*共享的*/ 目标文件 -o lib库名.so。即cc -shared add.o -o pcadd.so
生成ARM版本的用的目标文件:arm-linux-gnueabihf-gcc -c -fpic add.c
生成ARM用的库文件:arm-linux-gnueabihf-gcc -shared add.o -o armadd.so
3,动态库(共享库)的调用
只编译不链接生成目标文件xxx.o。如: cc -c main.c
链接共享库文件生成可执行文件,链接方式有以下三种:
(1)直接链接:gcc 目标文件 共享库文件名。即:cc main.o libadd.so
(2)采用编译选项进行链接:gcc 目标文件 -l 库名 -L 库文件所在的路径。即cc main.o -l add -L .
(3)通过配置环境变量LIBRARY_PATH进行链接 export LIBRARY_PATH=$LIBRARY_PATH:.
cc main.o -l add
调用共享库文件时需要配置环境变量LD_LIBRARY_PATH,具体的配置方法如下:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt
注意:当同一个目录中具有相同库名的静态库和共享库时,使用gcc/cc编译链接时会自动优先选择共享库进行链接,如果希望链接静态库则使用-static选项来强制要求。
4,共享库的动态加载
#include <dlfcn.h> 编译链接时需要指定选项 -ldl
(1)dlopen函数
void *dlopen(const char *filename, int flag);
(2)dlsym函数
void *dlsym(void *handle, const char *symbol);
第一个参数:共享库的句柄,dlopen函数的返回值
第二个参数:字符串形式的符号,一般指函数名
返回值:成功返回函数名所对应的内存地址,失败返回NULL
函数功能:主要用于查找指定共享库中指定函数被加载到内存中地址
(3)dlclose函数
int dlclose(void *handle);
函数功能:主要用于关闭/卸载参数指定的共享库,成功返回0,失败返回非0
(4)dlerror函数
char *dlerror(void);
函数功能:主要用于获取dlopen/dlsym/dlclose函数执行期间产生的最近一个错误信息通过返回值返回,如果没有产生错误,则返回值为NULL
3620

被折叠的 条评论
为什么被折叠?



