• 9451阅读
  • 0回复

[提问]再问QT程序发布时动态库问题 [复制链接]

上一主题 下一主题
离线bangqianchen
 

只看楼主 倒序阅读 楼主  发表于: 2009-02-19
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2011-01-07) —
环境:XP,VS2005 SP3,使用了数据库,Sql2005,目录结构:
release/RubberDB.exe
release/plugins/sqldrivers 下放了QtSql4.dll,QtGui4.dll,QtCore4.dll,qsqlodbc4.dll。
Qt是采用动态编译的。
main函数里面有设置环境变量的代码
    QStringList pathList=QApplication::libraryPaths();
    pathList.append(QDir::current().absolutePath()+"/plugins");           
    pathList.append(QApplication::applicationDirPath()+"/plugins");           
    QApplication::setLibraryPaths(pathList);

本机情况:   
在本机上设置管理员的环境变量PATH=E:\QT\4.4.3\Bin(我的QT安装目录)。
如果设置这个PATH,在release目录下直接双击exe文件可以启动。
如果没有这个环境变量,提示无法找到QtSql4.dll库,说明QApplication::setLibraryPaths(pathList)没有起作用,此时使用Dependency工具查看exe关于QT的dll都找不到,它只在exe同级目录下查找,具体情况如贴图所示 。这里把QtSql4.dll,QtGui4.dll,QtCore4.dll,qsqlodbc4.dll复制到于exe同级目录,可以运行没有问题。

其它未装QT的机器上:
编译release在其它机器上无法启动,参考
http://www.examda.com/ncre2/cpp/fudao/20080830/15051863.html里面的方式:

st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:
  msvcm80d.dll
  msvcp80d.dll
  msvcr80d.dll
  Microsoft.VC80.DebugCRT.manifest
  把这几个文件拷贝到目标机器上,与运行程序同一文件夹或放到system32下,就可以正确运行了。但是连接数据库出现driver not loaded,连不上 。以前我用VC6的时候,只要在main函数里面加了plugins路径后,就能运行,现在不知道如何解决了,都烦一两天了,想QT静态编译,参照
http://kevdmx.blog.51cto.com/429766/113118里修改qmake.conf里的MD,MDd为MT,MTd时,编译不过:
Generating Code...
        link /NOLOGO /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFEST /MANIFESTFILE:"tmp\obj\release_static\rcc.intermediate.manifest" /OUT:..\..\..\
bin\rcc.exe @C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\nmFDC.tmp
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already
defined in LIBCMT.lib(typinfo.obj)
MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAE
AAV0@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
..\..\..\bin\rcc.exe : fatal error LNK1169: one or more multiply defined symbols found
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\link.EXE"' : return code '0x491'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\nmake.EXE"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\nmake.EXE"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: 'cd' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\nmake.EXE"' : return code '0x2'
Stop.

晕了,麻烦大家给点意见!
 
快速回复
限100 字节
 
上一个 下一个