linux qt 添加动态链接库_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_EXPORTvoidTestA();extern "C"{

Z_DECL_EXPORTvoid TestB(int _i, int_j);

}#endif //DLLMAIN_H

3.2、dllMain.cpp

#include

voidTestA()

{

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

using namespacestd;

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

intmain()

{

cout<< "Hello World!" <

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、

你可能感兴趣的:(linux,qt,添加动态链接库)