Qt creator生成动态库

一、Qt工程配置

建立工程,选择New Project -> Library -> C++ Library:
在这里插入图片描述

去除Qt库依赖,取消选择QtCore:
在这里插入图片描述

配置完成后,因为没有选择Qt相关的库,直接编译会报错,可以删除global.h文件,其余.cpp、.h文件的内容也可以换成自己的。除了文件中没有main()函数,其余操作和一般的编程实现功能没有区别。编译完成后可以生成动态库。
本文测试的动态库源码文件内容如下:

//**version.h**
#ifndef VERSION_H
#define VERSION_H
extern int outputVersion();
#endif // VERSION_H

//**version.cpp**
#include "version.h"
#include <stdio.h>

int outputVersion()
{
    float version = 3.0;
    printf("software version: %.1f \n", version);
    return 0;
}

二、.pro文件设置

TARGET = version表示生成的目标文件名为version;
设置TEMPLATE = lib,表示模板为动态库;
加上CONFIG += plugin,只生成一个.so文件,如果不添加,则会出现.so.1 .so.1.0 .so.1.0.0这类带版本号的软链接;
本文不依赖于Qt库,因此在.pro文件中设置了CONFIG -= qt;
qmake添加DEFINE +=变量的值作为编译器C预处理器宏(-D选项),与代码中加上#define的功能类似;

#-------------------------------------------------
#
# Project created by QtCreator 2022-08-30T10:09:54
#
#-------------------------------------------------

TARGET = version
TEMPLATE = lib
CONFIG += plugin
CONFIG -= qt

DEFINES += VERSION_LIBRARY


# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += version.cpp

HEADERS += version.h

unix {
    target.path = /usr/lib
    INSTALLS += target
}

进行编译后,生成动态库libversion.so:
生成动态库

三、查看可执行程序的依赖库

如果是用于PC端的程序,查看可执行文件的依赖库可以使用ldd(list dynamic dependencies)命令:

ldd <可执行文件名>

对于交叉编译生成的可执行文件以及动态库文件,ldd无法识别,可以使用objdump命令或者readelf命令查看文件的依赖库:

objdump -x image_process | grep NEEDED  
readelf -a image_process | grep NEEDED

显示结果如下:

 0x00000001 (NEEDED)         Shared library: [libopencv_core.so.3.4]
 0x00000001 (NEEDED)         Shared library: [libopencv_features2d.so.3.4]
 0x00000001 (NEEDED)         Shared library: [libopencv_imgcodecs.so.3.4]
 0x00000001 (NEEDED)         Shared library: [libopencv_imgproc.so.3.4]
 0x00000001 (NEEDED)         Shared library: [libopencv_objdetect.so.3.4]
 0x00000001 (NEEDED)         Shared library: [libopencv_calib3d.so.3.4]
 0x00000001 (NEEDED)         Shared library: [libQt5Network.so.5]
 0x00000001 (NEEDED)         Shared library: [libQt5Core.so.5]
 0x00000001 (NEEDED)         Shared library: [libpthread.so.0]
 0x00000001 (NEEDED)         Shared library: [libstdc++.so.6]
 0x00000001 (NEEDED)         Shared library: [libm.so.6]
 0x00000001 (NEEDED)         Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)         Shared library: [libc.so.6]
 0x00000001 (NEEDED)         Shared library: [ld-linux-armhf.so.3]

参考链接

【1】https://blog.csdn.net/whatday/article/details/88561944

在Linux中,Qt Creator是一个强大的集成开发环境,用于开发跨平台的应用程序。在使用Qt Creator创建和调用动态库时,需要经过以下几个步骤: 1. 首先,在Qt Creator中新建一个工程。选择“Dynamic Library”作为项目类型。 2. 在工程文件中,定义需要暴露给其他程序使用的函数和类。可以在.h头文件中声明函数和类的接口,并在.cpp源文件中实现相应的功能。 3. 编译生成动态库文件。在Qt Creator中,可以点击“构建”按钮编译和链接生成动态库文件。生成动态库文件一般以.so(shared object)为扩展名。 4. 创建一个新的可执行程序项目,并引用该动态库。在新的项目中,需要在.pro文件中添加对动态库的依赖关系。例如,可以使用LIBS += -L/path/to/library -lmylibrary来指定动态库的路径和名称。 5. 在可执行程序中调用动态库中的函数或类。在主函数或其他需要使用动态库的地方,可以直接调用动态库中定义的函数或类,实现相应的功能。 值得注意的是,动态库的调用中还需要注意以下几点: 1. 在调用动态库函数时,需要先加载动态库。可以使用dlopen函数加载动态库文件,并使用dlsym函数获取需要调用的函数指针。 2. 调用动态库中的函数时,需要根据函数的参数类型进行适当的类型转换。因为动态库函数的参数类型可能与调用者的类型不完全匹配。 3. 在完成动态库的使用后,需要使用dlclose函数关闭对动态库的引用,释放相关资源。 总结来说,使用Qt Creator在Linux中创建和调用动态库需要进行项目的设置、编译生成动态库文件,然后在其他项目中引用动态库并调用其中定义的函数或类。同时,还需要注意动态库的加载和关闭过程,以确保正确使用动态库功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值