Жило-было приложение, написанное на MSVC 2005, которое использовало библиотеку Qt 4 версии в виде dll. Потом было решено заменить dll на статические библиотеки (Qt была удалена и пересобрана с опцией -static). В результате при компиляции появились ошибки вроде:
qtgui.lib(qfiledialog_win.obj) : error LNK2001: unresolved external symbol __imp__GetOpenFileNameA@4
И таких ошибок появилось много, аж 200 штук. Понятно, что можно явно включить в проект либы, в которых определены данные функции, но это геморно и поможет только на один раз. Есть ли способы справиться с данной проблемой?
21.01.10 12:30: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Здравствуйте, commando, Вы писали:
C>Жило-было приложение, написанное на MSVC 2005, которое использовало библиотеку Qt 4 версии в виде dll. Потом было решено заменить dll на статические библиотеки (Qt была удалена и пересобрана с опцией -static). В результате при компиляции появились ошибки вроде:
C>
C>qtgui.lib(qfiledialog_win.obj) : error LNK2001: unresolved external symbol __imp__GetOpenFileNameA@4
C>
Судя по __imp_ — функция явно откуда-то импортируется (из dll). Судя по имени — похожа на WinAPI.
Ищем в MSDN — comdlg32.dll,
Header: Declared in Commdlg.h, include Windows.h
Import library: Comdlg32.lib
Теперь идем в свойства проекта Project properties/Linker/Input/Additional Dependencies, добавляем comdlg32.
Когда вы собирали с Qt dll-ками, они уже импортировали все, что нужно, а ваш код непосредственно не вызывал эту функцию. а теперь Qt в либах, все внешние зависимости и вылезли, многие удовлетворены теми либами, которые MSVC всегда использует (Default libraries), но Comdlg32.lib к их числу не относится.
Можно попробовать что-нибудь автоматизировать через Project properties (в MSDN: Index — Property Manager) и читать там дальше. Тут вроде недавно инфа пробегала на эту тему.
Здравствуйте, Marty, Вы писали:
M>Теперь идем в свойства проекта Project properties/Linker/Input/Additional Dependencies, добавляем comdlg32.
Да, так и сделал, но аналогично пришлось подключать gdi32.lib, advapi32.lib и еще несколько либ. В общем, делать такое более одного раза весьма утомительно.
M>Когда вы собирали с Qt dll-ками, они уже импортировали все, что нужно, а ваш код непосредственно не вызывал эту функцию. а теперь Qt в либах, все внешние зависимости и вылезли, многие удовлетворены теми либами, которые MSVC всегда использует (Default libraries), но Comdlg32.lib к их числу не относится.
А нельзя ли заставить линкер ограничиться теми функциями, которые реально используются у меня в коде?
Кроме того, почему вообще мне приходится прописывать вручную либы, которые используются Qt? Ведь тот же boost (в части filesystem) работает без явного прописывания включаемых либ.
PS. Второй комментарий прочитал. Все-таки интереснее избежать данной проблемы в будущем, а не обходить ее.
Здравствуйте, commando, Вы писали:
C>А нельзя ли заставить линкер ограничиться теми функциями, которые реально используются у меня в коде? C>Кроме того, почему вообще мне приходится прописывать вручную либы, которые используются Qt? Ведь тот же boost (в части filesystem) работает без явного прописывания включаемых либ.
Думаю, они у тебя используются. Допустим, есть виртуальный метод у класса, который вызывает GetOpenFileName. Ты создаешь этот класс (или где-то в недрах Qt он создается), но метод не вызываешь. Но компилятор должен заполнить ячейку vtbl, и прилинковывает этот метод, а он уже тянет за собой GetOpenFileName.
Здравствуйте, commando, Вы писали:
C>А нельзя ли заставить линкер ограничиться теми функциями, которые реально используются у меня в коде? C>Кроме того, почему вообще мне приходится прописывать вручную либы, которые используются Qt? Ведь тот же boost (в части filesystem) работает без явного прописывания включаемых либ.
1) буст — это в основном шаблоны, тут никаких проблем нет, что не используется, то выкидывается.
2) в бусте используется #pragma comment, он вообще не требует указания каких либо либ явно (под MSVC).
Здравствуйте, commando, Вы писали:
C>И таких ошибок появилось много, аж 200 штук. Понятно, что можно явно включить в проект либы, в которых определены данные функции, но это геморно и поможет только на один раз. Есть ли способы справиться с данной проблемой?
я вчера с такой опцией компилировал на VS2005
никаких проблем, правда версию 4.3.4 (от версии Qt может зависеть, например 4.2.2 уже на 2005 не собирается — ошибки вылетают)