Разрешение неопределенных символов в qmake - PullRequest
0 голосов
/ 11 апреля 2019

Я использую файлы qmake и .pro для генерации моих файлов VisualStudio .vcxproj.

Я создал статическую библиотеку, которая содержит вспомогательные функции для всей моей обработки ошибок. Это включает в себя оболочки для извлечения кодов ошибок из QSqlTableModel и QSqlQuery.

Мой библиотечный проект имеет QT + = sql для поддержки этих методов.

Я пытаюсь избежать необходимости добавлять зависимость QT + = sql в приложение, которое связывает библиотеку, но в противном случае не использует sql.

Я передал QSqlTableModel и QSqlQuery в библиотеку как указатели и объявил их вперед, чтобы я мог без проблем скомпилировать.

Но я получаю ошибки компоновщика, неразрешенный внешний символ "__declspec (dllimport) public: class QSqlError __cdecl QSqlQueryModel :: lastError (void) const"

Я легко могу обойти ошибки компоновщика, добавив QT + = sql в мое приложение.

Но, учитывая, что мое приложение на самом деле никогда не вызовет этого, могу ли я просто заставить компоновщик успешно двигаться (и, возможно, приложение выдает большое структурированное исключение, если я его когда-либо вызывал)?

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Но, учитывая, что мое приложение никогда не будет вызывать это

Однако функции в вашей статической библиотеке будут вызывать это, поэтому вам нужно QT+=sql.

0 голосов
/ 11 апреля 2019

Звучит так, как будто вы хотите передать флаги компоновщика, например --allow-shlib-undefined (при условии, что компоновщик GNU). Возможно, вам придется добавить это к QMAKE_LFLAGS вручную.

Я не уверен, что вы подразумеваете здесь под «структурированным исключением» - если вызывается неопределенная функция, вы можете ожидать, что ваша программа получит SIGSEGV, что обычно приводит к дампу ядра. Конечно, это не то, с чем вы могли бы легко справиться и продолжить.

Лучшей стратегией было бы разделить вашу библиотеку на две библиотеки: одну, которая зависит только от Qt Core, и другую для использования с Qt Sql.

...