Hello,

I needed to extend the QPSQLDriver class do to slightly more then what the original class does. My new derived class is called PPSQLDriver (do not ask on the naming... I'm horrible at class naming). I defined this class in a static library (it does not need to be static... but it is right now). I then use this new class in several applications.

When building QT, if I specify to *not* build the PSQL driver as a plugin (but as a library instead) everything works great.

However if I build QT to have the PSQL driver built as a plugin I get a link error when linking to my library to my application (the library is built successfully and the application compiles successfully... it fails during linking however).

Here are the linker errors:
Qt Code:
  1. ...
  2. ...
  3. ../../lib/libpcccommond.a(ppsqldriver.o): In function `PPSQLDriver::commitTransaction(bool)':
  4. /home/jason/PCC/cvs/ehr/src/pcccommon/src/ppsqldriver.cpp:45: undefined reference to `QPSQLDriver::commitTransaction()'
  5. ../../lib/libpcccommond.a(ppsqldriver.o): In function `PPSQLDriver::beginTransaction()':
  6. /home/jason/PCC/cvs/ehr/src/pcccommon/src/ppsqldriver.cpp:32: undefined reference to `QPSQLDriver::beginTransaction()'
  7. ../../lib/libpcccommond.a(ppsqldriver.o): In function `PPSQLDriver::close()':
  8. /home/jason/PCC/cvs/ehr/src/pcccommon/src/ppsqldriver.cpp:25: undefined reference to `QPSQLDriver::close()'
  9. ../../lib/libpcccommond.a(ppsqldriver.o): In function `PPSQLDriver':
  10. /home/jason/PCC/cvs/ehr/src/pcccommon/src/ppsqldriver.cpp:7: undefined reference to `QPSQLDriver::QPSQLDriver(QObject*)'
  11. /home/jason/PCC/cvs/ehr/src/pcccommon/src/ppsqldriver.cpp:7: undefined reference to `QPSQLDriver::QPSQLDriver(QObject*)'
  12. ../../lib/libpcccommond.a(moc_ppsqldriver.o): In function `PPSQLDriver::qt_metacall(QMetaObject::Call, int, void**)':
  13. /home/jason/PCC/cvs/ehr/src/pcccommon/build/moc_ppsqldriver.cpp:68: undefined reference to `QPSQLDriver::qt_metacall(QMetaObject::Call, int, void**)'
  14. ../../lib/libpcccommond.a(moc_ppsqldriver.o): In function `PPSQLDriver::qt_metacast(char const*)':
  15. /home/jason/PCC/cvs/ehr/src/pcccommon/build/moc_ppsqldriver.cpp:63: undefined reference to `QPSQLDriver::qt_metacast(char const*)'
  16. ../../lib/libpcccommond.a(moc_ppsqldriver.o): In function `~PPSQLDriver':
  17. /home/jason/PCC/cvs/ehr/src/pcccommon/build/../src/ppsqldriver.h:15: undefined reference to `QPSQLDriver::~QPSQLDriver()'
  18. /home/jason/PCC/cvs/ehr/src/pcccommon/build/../src/ppsqldriver.h:15: undefined reference to `QPSQLDriver::~QPSQLDriver()'
  19. /home/jason/PCC/cvs/ehr/src/pcccommon/build/../src/ppsqldriver.h:15: undefined reference to `QPSQLDriver::~QPSQLDriver()'
  20. /home/jason/PCC/cvs/ehr/src/pcccommon/build/../src/ppsqldriver.h:15: undefined reference to `QPSQLDriver::~QPSQLDriver()'
  21. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro+0x0): undefined reference to `QPSQLDriver::staticMetaObject'
  22. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x38): undefined reference to `QPSQLDriver::isOpen() const'
  23. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x40): undefined reference to `QPSQLDriver::commitTransaction()'
  24. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x44): undefined reference to `QPSQLDriver::rollbackTransaction()'
  25. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x48): undefined reference to `QPSQLDriver::tables(QSql::TableType) const'
  26. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x4c): undefined reference to `QPSQLDriver::primaryIndex(QString const&) const'
  27. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x50): undefined reference to `QPSQLDriver::record(QString const&) const'
  28. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x54): undefined reference to `QPSQLDriver::formatValue(QSqlField const&, bool) const'
  29. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x58): undefined reference to `QPSQLDriver::escapeIdentifier(QString const&, QSqlDriver::IdentifierType) const'
  30. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x60): undefined reference to `QPSQLDriver::handle() const'
  31. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x64): undefined reference to `QPSQLDriver::hasFeature(QSqlDriver::DriverFeature) const'
  32. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x6c): undefined reference to `QPSQLDriver::createResult() const'
  33. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTV11PPSQLDriver[vtable for PPSQLDriver]+0x70): undefined reference to `QPSQLDriver::open(QString const&, QString const&, QString const&, QString const&, int, QString const&)'
  34. ../../lib/libpcccommond.a(moc_ppsqldriver.o):(.data.rel.ro._ZTI11PPSQLDriver[typeinfo for PPSQLDriver]+0x8): undefined reference to `typeinfo for QPSQLDriver'
  35. collect2: ld returned 1 exit status
  36. ...
  37. ...
To copy to clipboard, switch view to plain text mode 

I'm sure the reason this isn't working correctly is because I never actually load the PSQLDriver plugin, but I'm not really sure how to do that.

So:
  • How do I load the qsqlpsql plugin successfully?
  • Do I load the plugin in the library the defines the derived class? Or the application that uses my library?
  • Is there a way to make it "just work" transparently no matter if I build QT with the qsql_psql as a plugin or a library?
  • Does my scheme (deriving off of a plugin and putting that derived class in a library) even work when using the plugin architecture?


Thanks for any insight.

-Jason