转自:http://tgstdj.blog.163.com/blog/static/748200402012929101434465/ 其中有部分错误,但思路是对的
静态库, 单独的一个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 = mprint
TEMPLATE = 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();
}
运行结果:
TARGET = mprint
CONFIG += static # 生成静态库, 添加了这一句
TEMPLATE = lib
DEFINES += MPRINT_LIBRARY
SOURCES += mprint.cpp
HEADERS += mprint.h
#define MPRINT_H
#include <QtCore>
class Mprint // 要改这里, 就是把类名前面的那个修饰去掉
{
public:
Mprint();
void mprint(char *);
};
#endif // MPRINT_H
?????????????????
??????
因为当你修改pro文件后重新生成为静态库时原来的 libmprint.a 这个文件没有被删除, 当你改为静态库
重新生成时, ar 打包时发现这个文件已经存在了只是重新更新了 libmprint.a 文件内容, 并没有删除原来的
内容, 所以只要把 libmprint.a 这个文件删除重新生成一下就可以了.