LINUX.ORG.RU

Кросскомпиляция Qt CMake

 


1

1

Всем привет. Пытаюсь кросскомпилировать проект на Qt с помощью mxe. Хочу перейти с qmake на cmake. Вот мой CMakeLists.txt https://github.com/ismd/screenshotgun/blob/master/CMakeLists.txt

Запускаю вот так:
cmake <путь к исходникам> -DCMAKE_TOOLCHAIN_FILE=<путь к mxe>/usr/i686-w64-mingw32.static/share/cmake/mxe-conf.cmake
make

На стадии линковки получаю кучу ошибок типа «undefined reference to».
Вот вывод make http://paste.pound-python.org/show/E1lxxsfM1WQVLC1cHRiz/


Я собирал «стабильным» mxe проект, использовавший qt4.

Пришлось кучу всего подгибать вручную. Выискивал библиотеки с символами, на которые ругается линковщик, и явным образом добавлял их в свой CMakeLists.txt

В конце концов слинковался блоб весом 10-20 мегабайт, успешно запускавшийся на пустой семерочке

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 7)
Ответ на: комментарий от a1batross

Вот вывод make VERBOSE=1 http://paste.pound-python.org/show/RxpVpE7U6fPbMl3DZPCC/

Здесь видно, что запускается
/home/ismd/src/mxe/usr/bin/i686-w64-mingw32.static-g++ -std=c++11 -O3 -DNDEBUG -Wl,--whole-archive CMakeFiles/screenshotgun.dir/objects.a -Wl,--no-whole-archive -o screenshotgun.exe -Wl,--out-implib,libscreenshotgun.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/screenshotgun.dir/linklibs.rsp

Вот содержимое CMakeFiles/screenshotgun.dir/linklibs.rsp
/home/ismd/src/mxe/usr/i686-w64-mingw32.static/qt5/lib/libQt5Widgets.a /home/ismd/src/mxe/usr/i686-w64-mingw32.static/qt5/lib/libQt5Network.a /home/ismd/src/mxe/usr/i686-w64-mingw32.static/qt5/lib/libQt5Gui.a /home/ismd/src/mxe/usr/i686-w64-mingw32.static/qt5/lib/libQt5Core.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32

ismd
() автор топика

С динамической линковкой, кстати, всё нормально собирается. То есть если собрать mxe с MXE_TARGETS=i686-w64-mingw32.shared

ismd
() автор топика
Ответ на: комментарий от XMs

Спасибо, твой ответ заставил меня поискать поподробней про схожие проблемы с openssl.
Натолкнулся на такую ссылку https://lists.gnu.org/archive/html/mingw-cross-env-list/2012-08/msg00011.html
При сборке с помощью qmake анализируются prl-файлы, в которых указываются дополнительные библиотеки, которые нужно подключить. К примеру в файле <путь к mxe>/usr/i686-w64-mingw32.static/qt5/lib/Qt5Network.prl в переменной QMAKE_PRL_LIBS указаны библиотеки, в том числе -lssl

Попробовал добавить эти библиотеки при сборке, количество ошибок уменьшилось.

ismd
() автор топика
Ответ на: комментарий от ismd

То есть qmake смотрит эти prl-файлы, а cmake нет.

ismd
() автор топика
Ответ на: комментарий от ismd

Мне кажется, что тебе придётся дописывать вручную кучи библиотек. Ибо как раз в этой строке ни слова нет об opengl, openssl, zlib и других либ, функции которых как раз таки линкер найти не может.

Кстати, собранный из MXE Qt совершенно неюзабелен. Выдаёт бинари размером в несколько мегабайт. Надо лезть в его мейкфайл и там ключами убирать всякие ненужные библиотеки.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

Ага, я выше написал как можно получить список недостающих библиотек — из prl-файлов.
А как посоветуешь собирать qt-приложения для оффтопика? Нативно? Или всё же использовать mxe?

ismd
() автор топика
Ответ на: комментарий от ismd

Для лучшего результата наверно нативно, без вариантов. Тем более, что теперь QtCreator идет вместе с компилятором, и устанавливается все хозяйство одним екзешником (раньше было все гораздо более грустно).

Кросс-компиляцией имеет смысл пользоваться для ембеддент плитформ, но никак не для десктопа.

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Для лучшего результата наверно нативно, без вариантов. Тем более, что теперь QtCreator идет вместе с компилятором, и устанавливается все хозяйство одним екзешником (раньше было все гораздо более грустно).

А под wine оно работает из коробки?

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от Manhunt

Не пробовал, но ты ведь можешь сам проверить.

Я пробовал в ReactOs, но сия операционка оказалась неготова чтоб инсталлировать креатор. Зато в ней запускались уже собранные Qt-программы.

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Кросс-компиляцией имеет смысл пользоваться для ембеддент плитформ, но никак не для десктопа.

я собираю кроссом дле венды, удобно, венда не нужна для сборки
зачем «нативно» собирать ?

x905 ★★★★★
()
Ответ на: комментарий от x905

+1
У меня связка Qt + cmake + mxe в шаред нормально работают.
Еще можно дебажить вайновским дебагером ну и окончательно перепроверять в винде. Впрочем если ничего вендоспецифического не юзать, то проверка в винде нужна исключительно для самоуспокоения.

AF ★★★
()

Где-то читал что staticQT не дружит с CMake от слова совсем. Это проблема очень долгая и длинная, чьи корни уже и не понять. Выхода 2: шаред или qmake.

yanchick
()
$ cat CMakeLists.txt 


cmake_minimum_required(VERSION 2.8.11)

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt4 4.8.5 REQUIRED QtGui QtCore)

QT4_WRAP_CPP(MOC_SRCS main.cpp)

add_executable(blabla WIN32 main.cpp)
target_link_libraries(blabla
	Qt4::QtGui Qt4::QtCore
	jpeg mng lcms png tiff
	lzma z
	winmm imm32 ws2_32
)
Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

1) Т.е. все Windows-специфичные библиотеки нужно руками прописывать?
2) Для Qt5 набор оных будет другой?

anonymous
()
Ответ на: комментарий от anonymous

1) Не только Windows-специфичные. jpeg mng lcms png tiff lzma z — все прописаны только ради линковки Qt, напрямую я их не использую.
2) А хрен его знает. Скорее всего, другой

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

set(CMAKE_AUTOMOC ON)
QT4_WRAP_CPP(MOC_SRCS main.cpp)

Что-то одно — лишнее. С автомоком нужда в wrap_cpp отпала

XMs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.