• 3855阅读
  • 6回复

关于Windows下编译lib的问题 [复制链接]

上一主题 下一主题
离线lexdene
 
只看楼主 倒序阅读 楼主  发表于: 2011-11-24
关键词: lib
api.pro:
  1. TEMPLATE = lib
  2. TARGET = api
  3. VERSION = 0.1.1


在ubuntu下生成四个文件
libapi.so libapi.so.0 libapi.so.0.1 libapi.so.0.1.1
这样,我使用的地方用
client.pro
  1. LIBS += -lapi



可以成功地找到动态库,并能够成功运行。

但是在windows下,它生成两个文件:
api0.dll libapi0.a
这导致LIB += -lapi提示,找不到-lapi。

问题
能否在仅更改*.pro文件的条件下,让windows下生成的名字为api.dll。
离线ninsun

只看该作者 1楼 发表于: 2011-11-24
LIB += -lapi提示,找不到-lapi
一般是因为找到不到libapi0.a这个文件吧……
dll是程序运行时用的,编译时用.a文件……

LIBS += -L$$OUT_PWD/../output/debug/lib/ -lPluginManagerd
用诸如这样的,制定以下.a文件的路径……
离线lexdene
只看该作者 2楼 发表于: 2011-11-25
不是。
事实上的原因是,由于VERSION变量,在Windows下编译生成的库文件的名字被加了个'0',所以才找不到的。


我想问的问题是,不修改VERSION和LIBS,能否让Windows下编译生成的库文件名字没有那个'0'。
离线ninsun

只看该作者 3楼 发表于: 2011-11-25
Note: On Windows, specifying libraries with the -l option, as in the above example, will cause the library with the highest version number to be used; for example, libmath2.lib could potentially be used instead of libmathlib. To avoid this ambiguity, we recommend that you explicitly specify the library to be used by including the .lib file name suffix.

在qmake的帮助文档中找到了这么一段说明……
也就是说……本来……qmake应该是可以自动的定位库后面加版本号这种格式的库文件的……
然而,从说明文档中看……很有可能是它只支持vc的编译器……也就是后缀名为.lib的库才行……
minGW泪目了……
离线novesky

只看该作者 4楼 发表于: 2011-11-25
版本号确实有点诡异,我一般这么做的,先在pro或pri文件里定义一个函数qtLibName,用这个函数来生成-l后面正确的名字
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)


离线lexdene
只看该作者 5楼 发表于: 2011-11-28
感谢楼上各位大牛,
我找到了一个更好的解决办法。

构建时和使用时,分别使用
CONFIG += create_prl

CONFIG += use_prl

让Qt自己记录和使用额外的信息
离线ninsun

只看该作者 6楼 发表于: 2011-11-29
这个方法真给力……
多谢分享
这下自动版本号增长神马的功能似乎都可以写到qmake里面了……
快速回复
限100 字节
 
上一个 下一个