Qt5_Linux_动态库_简单例子


ZC: 我这里创建的是 不依赖 Qt的 动态链接库。

 

1、创建动态链接库工程(工程名为 “SharedLibZ”)

  Qt5 --> File... --> New File or Project ... --> 选择 "Libraries"的"C++ Library" --> Type:"Shared Library"(静态的话,选择"Statically Linked Livrary"),填好工程名,选好工程存放的位置 --> 选择编译工具 --> 选择需要的模块(所有的"√"都去掉,这样只需要C++库,不依赖任何QT库) --> 连续"Next",全部使用默认的值,直到最后"Finish"。

 

2、修改 创建好的工程内容

  2.1、看到 "sharedlibz_global.h" 中,有一个 Q_DECL_EXPORT,明显是导出函数要用的(类似Windows的DLL中的"__declspec(dllexport)")。其实 Q_DECL_EXPORT是在 "qcompilerdetection.h" 中定义的,"查找定义"之后看到 在Linux这种的定义是这样的:

    #define Q_DECL_EXPORT     __attribute__((visibility("default")))

  2.2、将 自动生成的文件"工程名_global.h"、"工程名.h"、"工程名.cpp"全部删掉,创建自己的 h/cpp文件 并写代码。(需要使用 Q_DECL_EXPORT 的话,就自己定义)

 

3、做一个简单的例子程序(动态库,?.so文件):

  3.1、dllMain.h

#ifndef DLLMAIN_H
#define DLLMAIN_H

#define Z_DECL_EXPORT     __attribute__((visibility("default")))

Z_DECL_EXPORT void TestA();
extern "C"
{
Z_DECL_EXPORT void TestB(int _i, int _j);
}

#endif // DLLMAIN_H

  3.2、dllMain.cpp

#include <stdio.h>

void TestA()
{
    printf("TestA()\n");
}

extern "C"
{
void TestB(int _i, int _j)
{
    printf("TestB() --> _i : %d, _j : %d\n", _i, _j);
}
}

    ZC: 如果 要使用 “extern "C"”来修饰一个函数的时候,记得要在 声明函数 和 实现函数 的地方都加上“extern "C"”。

  3.3、

#-------------------------------------------------
#
# Project created by QtCreator 2016-04-29T10:28:30
#
#-------------------------------------------------

QT       -= core gui #这里可以看到,它去掉了 Qt的相关库 #如果不显示的去掉它们的话,程序还是会依赖Qt库

TARGET = SharedLibZ
TEMPLATE = lib

DEFINES += SHAREDLIBZ_LIBRARY

SOURCES += \
    dllMain.cpp

HEADERS += \
    dllMain.h

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

 

4、

5、调用 DLL(工程名为 “SharedLibCallZ”)

  5.1、创建工程。"Non-Qt Project" 的 "Plain C++ Project"

  5.2、pro 文件中添加一行:“LIBS += -L/home/Qt5_Projects/build-SharedLibZ-Desktop_Qt_5_3_GCC_32bit-Debug -lSharedLibZ”

    ZC: 上面的 ?.so项目需要显示的去掉Qt相关库,貌似本工程不需要显示的去除Qt库...

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

LIBS += -L/home/Qt5_Projects/build-SharedLibZ-Desktop_Qt_5_3_GCC_32bit-Debug -lSharedLibZ

include(deployment.pri)
qtcAddDeployment()

  5.3、main.cpp

#include <iostream>
using namespace std;

#include "/home/Qt5_Projects/SharedLibZ/dllMain.h"

int main()
{
    cout << "Hello World!" << endl;

    TestA();
    TestB(1, 300);

    return 0;
}

 

 

6、

  ZC: 这样,一个 不依赖 Qt库 的 Linux动态库就做好了,使用它 也是没有问题的。

 

7、遗留问题:

  7.1、.so文件 的导出函数 的函数名 如何查看?(Windows下 有工具Depends)

  7.2、有“extern "C"” 和 没有“extern "C"”,导出函数的函数名 有何变化?

  7.3、导出函数 一般不加 函数参数压栈规则(__stdcall等)。是∵大家都是使用的 gcc的默认规则的原因?

  7.4、编译出来的 ?.so文件,必须放到指定的目录 或者 将?.so文件所在目录 加入环境变量。有任何优化的方案吗?

 

8、

9、

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM