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 是这个错误

对的,.a是静态链接库,相当于windows上的lib文件。.so是动态连接库,相当于windows上的dll文件。用法:
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文件的主要内容,如果未能解决你的问题,请参考以下文章

有关Linux的.a.so和.o文件---mark一下(转)

linux 静态库和动态库编译的区别

C/C++编译问题,静态库,动态库。

如何将qt静态库代码还原动态库

cpp文件是怎么变成可执行文件的?动态链接库又是啥呢?

静态库和动态库