qt创建动态库,静态库

转自: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();
}
运行结果:

qt创建动态库,静态库 - 栖 - 活着

########################################################
#  如果要生成静态库, 只要在 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 打的包
 
qt创建动态库,静态库 - 栖 - 活着
静态库不是不用 dll 文件吗, 为什么程序还要去链接这个 dll 文件呢???????????????????

 ?????????????????

??????

因为当你修改pro文件后重新生成为静态库时原来的 libmprint.a 这个文件没有被删除, 当你改为静态库

重新生成时, ar 打包时发现这个文件已经存在了只是重新更新了 libmprint.a 文件内容, 并没有删除原来的

内容, 所以只要把 libmprint.a 这个文件删除重新生成一下就可以了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值