Qt 中如何使用动态库.so文件或者静态库.a文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 中如何使用动态库.so文件或者静态库.a文件相关的知识,希望对你有一定的参考价值。
我创建了一个简单的student类student.h, 如下:
#include <QString>
class Student
public:
void setID(const int id)this->id = id;
int getID()constreturn id;
void setName(const QString name)this->name = name;
QString getName()constreturn name;
private:
int id;
QString name;
我把它编译成静态文件,Student.pro文件的内容如下:
TEMPLATE = lib
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
CONFIG+=staticlib
# Input
HEADERS += student.h
这样运行之后,就会产生一个libstudent.a文件,如果在其他项目使用这个libstudent.a文件,要怎么使用?
这个libstudent.a就应该是一个非开源的lib包吧?其他人是不是导入就可以使用了?怎么使用?
还有动态的.so怎么用?回答的好,我还可以加分
静态的我搞定了,请问动态的怎么用
我是在windows下做的,静态的使用libstudent.a文件就可以了
动态的产生了libstudent.a 文件,和student.dll文件,徐啊哟用那个文件?
我运行不会出错,但是debug就会抛出一个错误
during startup program exited with code 0xc0000135 是这个错误
1. 把libstudent.a拷贝到/usr/lib或者/lib目录下
2. 比如你的项目是test.c,可以这么编译:gcc -o test test.c libstudent.a 或者gcc -o test test.c -lstuent
.so库的用法一样。
补充:
早说你在windows平台嘛。。是用cygwin吗?把libstudent.a复制到/usr/lib或者/lib目录下,把dll复制到exe所在的目录。
.a文件是编译exe需要的,.dll文件是exe运行时需要的。 参考技术A 用静态的编译好程序,把动态的放到程序运行时的目录应该就会自动调用的 参考技术B 你可以试试haozip好压,这个应该可以解压,而且跨平台。
Linux动态库(.so)静态库(.a)的制作和使用
对于开发过程,常将一组具有近似、相似功能的函数集合封装为一个库,以便提高开发效率,提高代码复用率,特别是对于需要长期迭代的开发项目而言。而库又可分为静态库(.a)和动态库(.so)。
关于动态库和静态库的内容见:链接器、链接过程及相关概念解析 中 2.3 共享目标文件(.dll和.so) 和 3.1 符号解析(symbol resolution)——符号解析:③链接器怎样使用静态库解析引用(解析顺序与结果) 的相关内容。
1. 静态库制作及使用步骤
每个静态库的程序都要将整个静态库编译到可执行文件中,即每个程序都有一个代码副本。优点是将库函数本地化之后,调用速度很快,缺点是对系统资源(主要是内存)消耗大。适用于对时间要求高的核心程序,如内核的库函数的实现。
- ①将 .c 文件生成 .o 文件:
gcc -c add.c -o add.o
; - ②使用 ar 工具制作静态库:
ar rcs lib库名.a add.o sub.o div.o
; - ③编译静态库到可执行文件中:
gcc test.c lib库名.a -o a.out
;(参数顺序先源文件再库文件) - ④运行可执行目标文件
./a.out
;
头文件守卫:防止头文件被重复包含
#ifdef _HEAD_H_
#define _HEAD_H_
......
#endif
头文件宏定义相关知识可见:防止头文件重复包含:#ifndef 和 #prama once 比较
2. 动态库制作及使用步骤
动态库是多个可执行程序共享一份库文件(共享代码而不共享数据),其优点是节省内存,易于更新;缺点是由于实现机制,较静态库调用速度慢。适用于对速度要求不高,系统资源紧俏的场合。
- ①将 .c 文件生成 .o 文件,生成与位置无关的代码(PIC):
gcc -c add.c -o add.o -fPIC
; - ②使用 gcc -shared -o 制作动态库:
gcc -shared -o lib库名.so add.o sub.o div.o
; - ③编译可执行程序时,指定所使用的动态库。
−
l
-l
−l 指定库名,
−
L
-L
−L 指定库路径:
gcc test.c -o a.out -lmymath -L./lib
; - ④运行可执行目标文件
./a.out
;
其中对于④,若是直接执行会出错error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory
,解决该问题前首先辨别两个概念:
链接器(ld):工作于链接阶段,工作时需要
−
l
-l
−l 和
−
L
-L
−L;
动态链接器:工作于程序运行阶段,工作室需要提供动态库所在目录位置;
出错的原因在于,加载器运行时,发现有用到动态库,则调用位置记录在 i n t e r p interp interp节的动态链接器加载动态库,而动态链接器的环境变量中并不包含动态库文件,所以出错。
解决方法有四种如下:
(1) export LD_LIBRARY_PATH=动态库路径
(export表示加载生效),但这种方式只是临时生效,若是终端重启后就得再次设置;
(2) 将路径写入终端配置文件~/.bashrc
当中,该方法一劳永逸,且最好写的是绝对路径(vi编辑~/.bashrc
,写入以上指令并保存,然后在shell中source ~/.bashrc
,重启终端即可);
(3) 将
.
s
o
.so
.so 库放置在 /lib
文件夹下;
(4) 修改 sudo vi /etc/ld.so.conf
,在其中添加共享库绝对路径并保存(直接粘贴路径即可),再更新查找共享库的路径(使配置文件生效),在shell中使用sudo ldconfig (-v)
指令,再在shell中测试动态链接器可否找到共享库文件,使用ldd a.out
(不是notfound
提示即配置正确)进行测试;
以上是关于Qt 中如何使用动态库.so文件或者静态库.a文件的主要内容,如果未能解决你的问题,请参考以下文章