G++ и порядок линковки

Есть рабочее Qt-приложение. Пытаюсь собрать его в статический exe. Застрял на следующей проблеме:

Не хочет линковаться плагин phonon_ds9. Выбрасывает простыню undefined reference: pastebin.com/fQmF5Q6a
А именно затык на следующей команде:
g++ -Wl,-s -mthreads -Wl,-subsystem,windows -o release\app.exe object_script.app.Release  -L"d:\qt\qt-libs\lib" -lmingw32 -lqtmain -ldnsapi -ldxguid -lstrmiids -lmsdmo -ldmoguids -LD:/qt/qt-libs/plugins/phonon_backend -lphonon_ds9 -lphonon -lQtXml -lQtOpenGL -lQtNetwork -lglu32 -lopengl32 -lQtGui -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCore -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 -LD:\src\openssl-1.0.1c

Но если поменять порядок библиотек на такой (dxguid, strmiids, msdmo, dmoguids которые требует phonon_ds9 перенести в конец):
g++ -Wl,-s -mthreads -Wl,-subsystem,windows -o release\app.exe object_script.app.Release  -L"d:\qt\qt-libs\lib" -lmingw32 -lqtmain -ldnsapi -LD:/qt/qt-libs/plugins/phonon_backend -lphonon_ds9 -lphonon -lQtXml -lQtOpenGL -lQtNetwork -lglu32 -lopengl32 -lQtGui -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCore -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 -LD:\src\openssl-1.0.1c -ldxguid -lstrmiids -lmsdmo -ldmoguids

То линковка завершается успешно. Почему?
p.s. Верхнюю команду генерирует qmake.
  • Вопрос задан
  • 4719 просмотров
Пригласить эксперта
Ответы на вопрос 3
Mezomish
@Mezomish
Буквально недавно была отличная статья про компоновщик, почитайте.
В частности,
Другая важная деталь — это порядок событий; библиотеки привлекаются только, когда нормальная компоновка завершена, и они обрабатываются в порядке слева на право. Это значит, что если объект, извлекаемый из библиотеки в последнюю очередь, требует наличие символа из библиотеки, стоящей раньше в линии компоновки, то компоновщик не найдёт его автоматически.

Кстати, qmake генерирует такое по дефолту или вы сами добавляли эти библиотеки в .pro, в секцию LIBS? Если второе, то измените порядок там.
Ответ написан
mik_os
@mik_os Автор вопроса
Да, статью читал, но почему то подумал что раз идет линковка одного бинарника одной командой то линковщик должен сам разобраться… Да, ситуация в точности как в данной цитате.

Библиотеки добавлял я. Они и так в конце, но qmake _после_ них дописывает "-LD:/qt/qt-libs/plugins/phonon_backend -lphonon_ds9" (QTPLUGIN += phonon_ds9).

Видимо решением будет убрать phonon_ds9 из QTPLUGIN и самому вычислять путь к qt-dir/plugins/phonon_backend.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы