其中有部分错误,但思路是对的
静态库, 单独的一个lib或 .a文件 windows下为 .lib文件, gcc编译的库或linux下库为 .a 文件, 使用时只需要一个头文件(.h文件)和库文件
.lib文件或 .a 文件, 生成可执行文件后可以直接运行, 不需要其它的文件
动态库, windows下为 .dll 文件, linux或gcc 编译出来为 .so 文件, 使用时有两种办法:
1. 头文件, .lib 文件, .dll/.so 文件三个一起提供, 头文件和.lib用来编译生成执行文件用, dll/.so文件要和可执行文件一起提供才能运
行程序
2. 只有一个 .dll或.so 文件, 使用时 用 loadlibaray 来加载, 用GetProcAddress来取得函数地址, 运行, linux下用 dlopen函数等
dll或so文件要随可执行文件一起提供才可以运行
开发环境, qt creator , windows
qt 创建c++的动态库很容易, 只要在pro文件中把 TEMPLATE 设为 lib 就好了, 下而是我建的:
####################################################
#mprint.pro
####################################################
TARGET = mprintTEMPLATE = lib # 关键是这一句
SOURCES += mprint.cpp
HEADERS += mprint.h
///
// mprint.h
// 头文件中包含要导了类/函数的声明, 要在类名或函数名前而加
// Q_DECL_EXPORT 表示这个类是要导出的
///
#ifndef MPRINT_H
#define MPRINT_H
#include <QtCore>
//
class Q_DECL_EXPORT Mprint // 类名前而要加 Q_DECL_EXPORT, 表示这个类是要导出的
{
public:
Mprint();
void mprint(char *);
};
#endif // MPRINT_H
// mprint.cpp
// 是导出类的实现文件
#include "mprint.h"
#include <stdio.h>
Mprint::Mprint()
{
}
void Mprint::mprint(char *str)
{
printf ("%s\n", str);
}
然后编译就会生成相应的库文件:
mprint.lib
mprint.dll
然后要以新建一个工程来测试库是不是可以用:
用 qt creator 新建一个控制台项目:
把生成的 mprint.dll和 mprint.lib 以及 mprint.h 三个文件复制到你的工程目下面
然后把 mprint.h 改成这样
///
// 修改后的 mprint.h
//
#ifndef MPRINT_H
#define MPRINT_H
#include <QtCore>
class Q_DECL_IMPORT Mprint // 改了这里, 生成库时这里是 Q_DECL_EXPORT 当使用库时要改为 Q_DECL_IMPORT
{
public:
Mprint();
void mprint(char *);
};
#endif // MPRINT_H
/
// 测试工程pro文件
// qtuselib.pro
// 要在qt中使用动态库文件要在 pro 文件中把库加进来, 这样在编译
// 才会链接到相应的库, 具体就是加上这么一句:
// LIBS += 你的库文件路径
// 如果是在linux系统中那么这一句要写成这样:
// LIBS += -Lpath -lfilename 这里的path是你的库所在的目录不包含库文件名
// 后面的filename是你的库文件名,不包含后缀
// 比如你的库文件为: /home/wish/lib/libmprint.a
// 那么就要写成这样:
// LIBS += -L/home/wish/lib -lmprint 库文件名前面的 lib 三个字母不要
QT += core
QT -= gui
TARGET = qtuselib
CONFIG += console
CONFIG -= app_bundle
LIBS += ./mprint.lib // windows写法, 要使用库, 关键是这一句
TEMPLATE = app
SOURCES += main.cpp///
// 测试工程 main.cpp
#include <QCoreApplication>
#include "mprint.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Mprint * mp = new Mprint;
mp->mprint("function from lib");
return a.exec();
}
运行结果:
########################################################
# 如果要生成静态库, 只要在 mprint.pro 添加这样一句:
# CONFIG += static
# 生成静态库的 pro 文件
########################################################
QT -= gui
TARGET = mprint
CONFIG += static # 生成静态库, 添加了这一句
TEMPLATE = lib
DEFINES += MPRINT_LIBRARY
SOURCES += mprint.cpp
HEADERS += mprint.h
重新编译 mprint 工程, 生成新的
mprint.lib
把mprint.lib复制到测试工程下面覆盖掉原来的,
把测试工程下面的 mprint.h 改成这样
/
// 测试工程下面的 mprint.h
///
#ifndef MPRINT_H
#define MPRINT_H
#include <QtCore>
class Mprint // 要改这里, 就是把类名前面的那个修饰去掉
{
public:
Mprint();
void mprint(char *);
};
#endif // MPRINT_H
因为静态库是不需要 dll 文件的所以我们把测试工程下面的 mprint.dll 文件删除掉, 然后重新编译, 运行.如
果一切正常那就没问题了.
如果你非常竟外的什么也没有输出, 如果你双击生成的exe文件运行, 你看到了这个:
说明你用的可能能是gcc编译器..........用qt 生成 lib 时用 ar 打的包
静态库不是不用 dll 文件吗, 为什么程序还要去链接这个 dll 文件呢???????????????????
?????????????????
??????
因为当你修改pro文件后重新生成为静态库时原来的 libmprint.a 这个文件没有被删除, 当你改为静态库
重新生成时, ar 打包时发现这个文件已经存在了只是重新更新了 libmprint.a 文件内容, 并没有删除原来的
内容, 所以只要把 libmprint.a 这个文件删除重新生成一下就可以了.
















