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、