Arman_1367
جمعه 23 دی 1390, 11:09 صبح
با سلام و خسته نباشید.
قبل از هر چیز ممنون از این که وقت می گذارید و این متن رو می خوانید.
دوستان من با زبانهای مختلفی برنامه می نویسم و چند وقتی هست به فکر پورت کردن برنامه های خودم روی Qt شدم. تا اونجا که من سر در اوردم باید برای بر قراری ارتباط با بانک اطلاعاتی درایور آن بانک را در کنار Qt کمپایل کنیم و بعدش می شود از درایور استفاده کرد.حالا مشکل چیست ؟
مشکل این هست که من مجموعه ای از کمپایلر های مختلف دارم و برای کمپایل کردن فرضاً ODBC درایور از دستورات زیر استفاده می کنم :
cd %QTDIR%\src\plugins\sqldrivers\mysql
بعد هم دستور qmake رو اجرا می کنم اما برای اجرای درستور make چون من همزمان هم دلفی هم Vs رو دارم وقتی دستور make رو می زنم نسخه مربوط به دلفی اجرا می شه و خطای زیر رو می دهد :
MAKE Version 5.4 Copyright (c) 1987, 2010 Embarcadero Technologies, Inc.
Fatal: 'FORCE' does not exist - don't know how to make it
خب این مشکل رو توانستم با اجرای دستور زیر حل کنم ( البته فکر کنم باید حل شده باشه :
C:/Qt/2010.05/mingw/bin/mingw32-make.exe
و دستور خروجی زیر را به من داد :
C:/Qt/2010.05/mingw/bin/mingw32-make.exe -f Makefile.Debug all
mingw32-make.exe[1]: Entering directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers
/odbc'
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -
DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -I"..\..\..\..\i
nclude\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\ActiveQt" -I"tmp\mo
c\debug_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\debug_shared\main.o
main.cpp
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -
DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -I"..\..\..\..\i
nclude\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\ActiveQt" -I"tmp\mo
c\debug_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\debug_shared\qsql_o
dbc.o ..\..\..\sql\drivers\odbc\qsql_odbc.cpp
..\..\..\sql\drivers\odbc\qsql_odbc.cpp: In function 'QString qGetStringData(voi
d*, int, int, bool)':
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:403: warning: comparison between signed
and unsigned integer expressions
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:444: warning: comparison between signed
and unsigned integer expressions
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -
DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -I"..\..\..\..\i
nclude\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\ActiveQt" -I"tmp\mo
c\debug_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\debug_shared\moc_qs
ql_odbc.o tmp\moc\debug_shared\moc_qsql_odbc.cpp
windres -i qsqlodbcd_resource.rc -o tmp\obj\debug_shared\qsqlodbcd_resource_res.
o --include-dir=. -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_TO_ASCII -DQT_NO
_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUP
PORT
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -mthreads -Wl -shared -Wl,--out-implib,c:\Qt\2010.05\qt\plugins\sqldrivers\li
bqsqlodbcd4.a -o ..\..\..\..\plugins\sqldrivers\qsqlodbcd4.dll tmp/obj/debug_sha
red/main.o tmp/obj/debug_shared/qsql_odbc.o tmp/obj/debug_shared/moc_qsql_odbc.o
-L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" tmp\obj\debug_shared\qsqlodb
cd_resource_res.o -lodbc32 -lQtSqld4 -lQtCored4
Creating library file: c:\Qt\2010.05\qt\plugins\sqldrivers\libqsqlodbcd4. a
mingw32-make.exe[1]: Leaving directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers/
odbc'
C:/Qt/2010.05/mingw/bin/mingw32-make.exe -f Makefile.Release all
mingw32-make.exe[1]: Entering directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers
/odbc'
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
-DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN
-DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -
I"..\..\..\..\include\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\Acti
veQt" -I"tmp\moc\release_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\re
lease_shared\main.o main.cpp
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
-DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN
-DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -
I"..\..\..\..\include\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\Acti
veQt" -I"tmp\moc\release_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\re
lease_shared\qsql_odbc.o ..\..\..\sql\drivers\odbc\qsql_odbc.cpp
..\..\..\sql\drivers\odbc\qsql_odbc.cpp: In function 'QString qGetStringData(voi
d*, int, int, bool)':
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:403: warning: comparison between signed
and unsigned integer expressions
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:444: warning: comparison between signed
and unsigned integer expressions
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
-DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN
-DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -
I"..\..\..\..\include\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\Acti
veQt" -I"tmp\moc\release_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\re
lease_shared\moc_qsql_odbc.o tmp\moc\release_shared\moc_qsql_odbc.cpp
windres -i qsqlodbc_resource.rc -o tmp\obj\release_shared\qsqlodbc_resource_res.
o --include-dir=. -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_TO_ASCII -DQT_NO
_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -
DQT_THREAD_SUPPORT
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -Wl,-s -mthreads -Wl -shared -Wl,--out-implib,c:\Qt\2010.05\qt\plugins\sqldri
vers\libqsqlodbc4.a -o ..\..\..\..\plugins\sqldrivers\qsqlodbc4.dll tmp/obj/rele
ase_shared/main.o tmp/obj/release_shared/qsql_odbc.o tmp/obj/release_shared/moc_
qsql_odbc.o -L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" tmp\obj\release_s
hared\qsqlodbc_resource_res.o -lodbc32 -lQtSql4 -lQtCore4
Creating library file: c:\Qt\2010.05\qt\plugins\sqldrivers\libqsqlodbc4.a
mingw32-make.exe[1]: Leaving directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers/
odbc'
به هر حال فکر کنم خطایی وجود نداشت برای همین رفتم داخل Qt و بعد از افزودن Qt+=Sql به فایل پروژه و افزودن
#include <QtSql/QODBCDriver>
فایل مربوطه خواستم از دستوری مثل دستور زیر کمپایل بگیرم
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
اما حاصل کمپایل خطای زیر هست :
C:/Qt/2010.05/SQLServerTest-build-desktop/../SQLServerTest/mainwindow.cpp:: In member function 'void MainWindow::on_pushButton_clicked()':
error :variable 'QSqlDatabase db' has initializer but incomlete type
error :incomplete type QSqlDatabase userd in nested name specifier
warning :unused variable 'db'
واو فکر کنم سوالم خیلی ابتدایی باشه اما واقعاً توش گیر افتادم :دی
قبل از هر چیز ممنون از این که وقت می گذارید و این متن رو می خوانید.
دوستان من با زبانهای مختلفی برنامه می نویسم و چند وقتی هست به فکر پورت کردن برنامه های خودم روی Qt شدم. تا اونجا که من سر در اوردم باید برای بر قراری ارتباط با بانک اطلاعاتی درایور آن بانک را در کنار Qt کمپایل کنیم و بعدش می شود از درایور استفاده کرد.حالا مشکل چیست ؟
مشکل این هست که من مجموعه ای از کمپایلر های مختلف دارم و برای کمپایل کردن فرضاً ODBC درایور از دستورات زیر استفاده می کنم :
cd %QTDIR%\src\plugins\sqldrivers\mysql
بعد هم دستور qmake رو اجرا می کنم اما برای اجرای درستور make چون من همزمان هم دلفی هم Vs رو دارم وقتی دستور make رو می زنم نسخه مربوط به دلفی اجرا می شه و خطای زیر رو می دهد :
MAKE Version 5.4 Copyright (c) 1987, 2010 Embarcadero Technologies, Inc.
Fatal: 'FORCE' does not exist - don't know how to make it
خب این مشکل رو توانستم با اجرای دستور زیر حل کنم ( البته فکر کنم باید حل شده باشه :
C:/Qt/2010.05/mingw/bin/mingw32-make.exe
و دستور خروجی زیر را به من داد :
C:/Qt/2010.05/mingw/bin/mingw32-make.exe -f Makefile.Debug all
mingw32-make.exe[1]: Entering directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers
/odbc'
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -
DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -I"..\..\..\..\i
nclude\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\ActiveQt" -I"tmp\mo
c\debug_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\debug_shared\main.o
main.cpp
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -
DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -I"..\..\..\..\i
nclude\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\ActiveQt" -I"tmp\mo
c\debug_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\debug_shared\qsql_o
dbc.o ..\..\..\sql\drivers\odbc\qsql_odbc.cpp
..\..\..\sql\drivers\odbc\qsql_odbc.cpp: In function 'QString qGetStringData(voi
d*, int, int, bool)':
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:403: warning: comparison between signed
and unsigned integer expressions
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:444: warning: comparison between signed
and unsigned integer expressions
g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -
DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -
DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -I"..\..\..\..\i
nclude\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\ActiveQt" -I"tmp\mo
c\debug_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\debug_shared\moc_qs
ql_odbc.o tmp\moc\debug_shared\moc_qsql_odbc.cpp
windres -i qsqlodbcd_resource.rc -o tmp\obj\debug_shared\qsqlodbcd_resource_res.
o --include-dir=. -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_TO_ASCII -DQT_NO
_CAST_FROM_ASCII -DQT_DLL -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUP
PORT
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -mthreads -Wl -shared -Wl,--out-implib,c:\Qt\2010.05\qt\plugins\sqldrivers\li
bqsqlodbcd4.a -o ..\..\..\..\plugins\sqldrivers\qsqlodbcd4.dll tmp/obj/debug_sha
red/main.o tmp/obj/debug_shared/qsql_odbc.o tmp/obj/debug_shared/moc_qsql_odbc.o
-L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" tmp\obj\debug_shared\qsqlodb
cd_resource_res.o -lodbc32 -lQtSqld4 -lQtCored4
Creating library file: c:\Qt\2010.05\qt\plugins\sqldrivers\libqsqlodbcd4. a
mingw32-make.exe[1]: Leaving directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers/
odbc'
C:/Qt/2010.05/mingw/bin/mingw32-make.exe -f Makefile.Release all
mingw32-make.exe[1]: Entering directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers
/odbc'
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
-DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN
-DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -
I"..\..\..\..\include\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\Acti
veQt" -I"tmp\moc\release_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\re
lease_shared\main.o main.cpp
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
-DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN
-DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -
I"..\..\..\..\include\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\Acti
veQt" -I"tmp\moc\release_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\re
lease_shared\qsql_odbc.o ..\..\..\sql\drivers\odbc\qsql_odbc.cpp
..\..\..\sql\drivers\odbc\qsql_odbc.cpp: In function 'QString qGetStringData(voi
d*, int, int, bool)':
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:403: warning: comparison between signed
and unsigned integer expressions
..\..\..\sql\drivers\odbc\qsql_odbc.cpp:444: warning: comparison between signed
and unsigned integer expressions
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT
-DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN
-DQT_SQL_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -I"..\..\..\..\include\QtCore" -
I"..\..\..\..\include\QtSql" -I"..\..\..\..\include" -I"..\..\..\..\include\Acti
veQt" -I"tmp\moc\release_shared" -I"..\..\..\..\mkspecs\win32-g++" -o tmp\obj\re
lease_shared\moc_qsql_odbc.o tmp\moc\release_shared\moc_qsql_odbc.cpp
windres -i qsqlodbc_resource.rc -o tmp\obj\release_shared\qsqlodbc_resource_res.
o --include-dir=. -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_NO_CAST_TO_ASCII -DQT_NO
_CAST_FROM_ASCII -DQT_DLL -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -
DQT_THREAD_SUPPORT
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -Wl,-s -mthreads -Wl -shared -Wl,--out-implib,c:\Qt\2010.05\qt\plugins\sqldri
vers\libqsqlodbc4.a -o ..\..\..\..\plugins\sqldrivers\qsqlodbc4.dll tmp/obj/rele
ase_shared/main.o tmp/obj/release_shared/qsql_odbc.o tmp/obj/release_shared/moc_
qsql_odbc.o -L"c:\Qt\2010.05\qt\lib" -L"c:\Qt\2010.05\qt\lib" tmp\obj\release_s
hared\qsqlodbc_resource_res.o -lodbc32 -lQtSql4 -lQtCore4
Creating library file: c:\Qt\2010.05\qt\plugins\sqldrivers\libqsqlodbc4.a
mingw32-make.exe[1]: Leaving directory `C:/Qt/2010.05/qt/src/plugins/sqldrivers/
odbc'
به هر حال فکر کنم خطایی وجود نداشت برای همین رفتم داخل Qt و بعد از افزودن Qt+=Sql به فایل پروژه و افزودن
#include <QtSql/QODBCDriver>
فایل مربوطه خواستم از دستوری مثل دستور زیر کمپایل بگیرم
QSqlDatabase db=QSqlDatabase::addDatabase("QODBC");
اما حاصل کمپایل خطای زیر هست :
C:/Qt/2010.05/SQLServerTest-build-desktop/../SQLServerTest/mainwindow.cpp:: In member function 'void MainWindow::on_pushButton_clicked()':
error :variable 'QSqlDatabase db' has initializer but incomlete type
error :incomplete type QSqlDatabase userd in nested name specifier
warning :unused variable 'db'
واو فکر کنم سوالم خیلی ابتدایی باشه اما واقعاً توش گیر افتادم :دی