static Qt - проблемы с линковкой
От: commando Россия  
Дата: 09.09.08 19:09
Оценка:
Жило-было приложение, написанное на 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++. Прикладные вопросы' — Кодт
Re: static Qt - проблемы с линковкой
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.09.08 20:27
Оценка:
Здравствуйте, 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 к их числу не относится.
Маньяк Робокряк колесит по городу
Re[2]: static Qt - проблемы с линковкой
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.09.08 20:31
Оценка:
Здравствуйте, Marty, Вы писали:

Ага, прочитал вопрос до конца
Думаю, нет.

Можно попробовать что-нибудь автоматизировать через Project properties (в MSDN: Index — Property Manager) и читать там дальше. Тут вроде недавно инфа пробегала на эту тему.
Маньяк Робокряк колесит по городу
Re[2]: static Qt - проблемы с линковкой
От: commando Россия  
Дата: 09.09.08 20:43
Оценка:
Здравствуйте, 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. Второй комментарий прочитал. Все-таки интереснее избежать данной проблемы в будущем, а не обходить ее.
Re[3]: static Qt - проблемы с линковкой
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.09.08 20:52
Оценка:
Здравствуйте, commando, Вы писали:

Может помочь вставка нижеследующего в каком-нибудь хидере, который подключается во всех проектах.
#pragma comment(lib, "comdlg32")
// и для прочих аналогично


Если проект кроссплатформенный, то лучше обрамить это так:
#ifdef _MSC_VER
    #pragma comment(lib, "comdlg32")
    // и для прочих аналогично
#endif
Маньяк Робокряк колесит по городу
Re[3]: static Qt - проблемы с линковкой
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.09.08 20:56
Оценка:
Здравствуйте, commando, Вы писали:

C>А нельзя ли заставить линкер ограничиться теми функциями, которые реально используются у меня в коде?

C>Кроме того, почему вообще мне приходится прописывать вручную либы, которые используются Qt? Ведь тот же boost (в части filesystem) работает без явного прописывания включаемых либ.

Думаю, они у тебя используются. Допустим, есть виртуальный метод у класса, который вызывает GetOpenFileName. Ты создаешь этот класс (или где-то в недрах Qt он создается), но метод не вызываешь. Но компилятор должен заполнить ячейку vtbl, и прилинковывает этот метод, а он уже тянет за собой GetOpenFileName.
Маньяк Робокряк колесит по городу
Re[3]: static Qt - проблемы с линковкой
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.09.08 20:59
Оценка: 1 (1)
Здравствуйте, commando, Вы писали:

C>А нельзя ли заставить линкер ограничиться теми функциями, которые реально используются у меня в коде?

C>Кроме того, почему вообще мне приходится прописывать вручную либы, которые используются Qt? Ведь тот же boost (в части filesystem) работает без явного прописывания включаемых либ.
1) буст — это в основном шаблоны, тут никаких проблем нет, что не используется, то выкидывается.
2) в бусте используется #pragma comment, он вообще не требует указания каких либо либ явно (под MSVC).
Маньяк Робокряк колесит по городу
Re: static Qt - проблемы с линковкой
От: chipmunk  
Дата: 09.09.08 21:20
Оценка:
Здравствуйте, commando, Вы писали:

C>И таких ошибок появилось много, аж 200 штук. Понятно, что можно явно включить в проект либы, в которых определены данные функции, но это геморно и поможет только на один раз. Есть ли способы справиться с данной проблемой?


я вчера с такой опцией компилировал на VS2005
никаких проблем, правда версию 4.3.4 (от версии Qt может зависеть, например 4.2.2 уже на 2005 не собирается — ошибки вылетают)
Re[4]: static Qt - проблемы с линковкой
От: commando Россия  
Дата: 10.09.08 20:50
Оценка:
M>2) в бусте используется #pragma comment, он вообще не требует указания каких либо либ явно (под MSVC).

А, т.е. это недоработка Qt, что она явно не указывает либы, которые ей нужны для работы. Спасибо, примерно это и хотел услышать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.