• 6464阅读
  • 6回复

请教如何进行windows下的动态库开发 [复制链接]

上一主题 下一主题
离线shibanyu
 
只看楼主 倒序阅读 楼主  发表于: 2011-10-23

我写了一个小工程,主要功能写在library上,方便升级;应用程序通过.h与.dll调用真正的功能。
工程在Linux下顺利编译运行,WindowsXP_zhCN + Qt_SDK_Win_offline_v1_1_3_en + VS2008下面可以生成.dll,但是应用程序链接时总提示找不到库,而且链接是.lib而不是.dll,我是在build目录下qmake ..,然后nmake的。

想了下,应该是src.pro中的"win32:LIBS += -L../lib/debug -lMClass"写得有问题
请教达人:
1、链接windows下的库,.pro中该怎么写。
2、不想链接静态库,就想用动态的,怎么在.pro中指定。
3、build目录下会有debug、release目录,怎么在.pro中修改CONFIG += release就可以自动实现"LIBS += -L../lib/release -lMClass",而不需要修改LIBS指定库路径。

感谢!
离线shibanyu
只看该作者 1楼 发表于: 2011-10-23

上传附件好慢
描述:工程
附件: dll.tgz (4 K) 下载次数:1
离线XChinux

只看该作者 2楼 发表于: 2011-10-23
请在Qt帮助中索引“Creating Shared Libraries”
就知道如何做了。

在动态库头文件中加:
#include <QtCore/QtGlobal>

#if defined(MYSHAREDLIB_LIBRARY)
#  define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
#  define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif

在动态库.pro文件中加:
DEFINES += MYSHAREDLIB_LIBRARY

你的太文件中原来的语句:
class Q_DECL_EXPORT MClass:public QObject

要改为:
class MYSHAREDLIB_EXPORT MyClass : public QObject


二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线浪漫天使
只看该作者 3楼 发表于: 2011-10-25
离线shibanyu
只看该作者 4楼 发表于: 2011-10-29
感谢"Xchinux"和"浪漫天使",提供的都是正解。

这windows下的编译和Linux下确实有些不一样:
windows的.lib文件在链接的时候也需要,而linux在链接.so的时候不需要.a;感觉windows在link.exe的时候使用.lib,而运行加载的时候使用.dll。
不知道我这种理解对不对。

另外还有关于qmake工程的问题在test/test.pro中需要请教:
1、同一个工程内部,B目录的编译依赖于A目录的install,能否实现?是否必须拆分成两个工程。
2、是否有类似于PROJECT_DIR的变量,可以在.pro文件中标示项目的根目录。
3、windows的库版本变化会导致库文件名的变化,在链接的时候怎么才能自适应这种版本变化。

感谢!

离线shibanyu
只看该作者 5楼 发表于: 2011-10-29
附件是新修改的工程新修改的工程 dll.tgz (4 K) 下载次数:6
离线novesky

只看该作者 6楼 发表于: 2011-11-25
回 4楼(shibanyu) 的帖子
1.install是指make install还是什么?
2.我也尝试找过,木有找到这种变量,手工指定吧
3.版本号确实有点诡异,我一般这么做的,先在pro或pri文件里定义一个函数qtLibName,用这个函数来生成-l后面正确的名字。当然还要结合版主提出的代码修改,在win下必须的
defineReplace(qtLibName) {
    #TEMPLATE += fakelib
    #LIB_FULLNAME = $$qtLibraryTarget($$1)
    #TEMPLATE -= fakelib
    unset(LIBRARY_NAME)
    LIBRARY_NAME = $$1
    CONFIG(debug, debug|release) {
        !debug_and_release|build_pass {
            mac:RET = $$member(LIBRARY_NAME, 0)_debug
            else:win32:RET = $$member(LIBRARY_NAME, 0)d
        }
    }
    isEmpty(RET):RET = $$LIBRARY_NAME
    !win32: return($$RET)

    isEmpty(2): VERSION_EXT = $$VERSION
    else: VERSION_EXT = $$2
    !isEmpty(VERSION_EXT) {
        VERSION_EXT = $$section(VERSION_EXT, ., 0, 0)
        isEqual(VERSION_EXT, 0):unset(VERSION_EXT)
    }
    RET = $${RET}$${VERSION_EXT}
    unset(VERSION_EXT)
    return($$RET)
}

win下若静态链接,-l$$qtLibName(api)
动态链接: -l$$qtLibName(api, 0.1.1)
linux下:-l$$qtLibName(api)
快速回复
限100 字节
 
上一个 下一个