Russian Qt Forum
Ноябрь 22, 2024, 23:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема при компиляции через CMake под ARM  (Прочитано 9013 раз)
tohisu
Гость
« : Январь 27, 2010, 12:37 »

Добрый день!
Решил использовать CMake для сборки проекта. Точнее решил не совсем я. Просто часть проекта уже создана на CMake и пришлось перенести все остальное сюда же.
При компиляции под десктоп ни каких проблем нет. Все собирается и работает. Проблемы начинаются когда я пытаюсь собрать под ARM:

Код:
Scanning dependencies of target mshell
[ 38%] Building CXX object mshell/CMakeFiles/mshell.dir/src/vkeyboard.cpp.o
/usr/local/Trolltech/Qt-4.6.0/include/QtCore/qatomic_arm.h: Assembler messages:
/usr/local/Trolltech/Qt-4.6.0/include/QtCore/qatomic_arm.h:131: Error: no such instruction: `swpb %sil,%dl,[%eax]'
make[2]: *** [mshell/CMakeFiles/mshell.dir/src/vkeyboard.cpp.o] Error 1
make[1]: *** [mshell/CMakeFiles/mshell.dir/all] Error 2
make: *** [all] Error 2

Кусочек из qatomic_arm.h, на который ругается:
Код:
inline char q_atomic_swp(volatile char *ptr, char newval)
{
    register char ret;
    asm volatile("swpb %0,%2,[%3]"
                 : "=&r"(ret), "=m" (*ptr)
                 : "r"(newval), "r"(ptr)
                 : "cc", "memory");
    return ret;
}

Самое интересное, что если собирать тот же самый проект без cmake, используя qmake && make, то все отлично компилируется и запускается на девайсе.
Перерыл весь инет уже Грустный((
Записан
Rcus
Гость
« Ответ #1 : Январь 27, 2010, 13:00 »

а как cmake вызываете перед сборкой? А то кажется что вызвали системный g++ вместо кросскомпилятора.
Записан
tohisu
Гость
« Ответ #2 : Январь 27, 2010, 13:13 »

а как cmake вызываете перед сборкой? А то кажется что вызвали системный g++ вместо кросскомпилятора.

В общем делаю так:
1) chroot_юсь в систему (не знаю как это назвать правильнее Улыбающийся)
2) Запускаю скрипт:
Цитировать
#!/bin/sh

PATH=$PATH:/usr/local/Trolltech/Qt-4.6.0/bin
export $PATH

rm -rf build
mkdir -p build
cd build

cmake -D PLATFORM=QTARM ..
make

А как указать каким компилятором компилировать? QMake похоже сам выбирал компилятор, которым собирались либы, а CMake о нем не знает получается?
Записан
Rcus
Гость
« Ответ #3 : Январь 27, 2010, 13:21 »

Я делал в точности как описано по первой ссылке в google: 'cmake cross compile arm'.
Записан
tohisu
Гость
« Ответ #4 : Январь 27, 2010, 14:14 »

Я делал в точности как описано по первой ссылке в google: 'cmake cross compile arm'.

Спасибо Улыбающийся
Я тоже ее нашел Улыбающийся
В общем добавил в раздел для ARM:
Цитировать
...
elseif(${PLATFORM} STREQUAL QTARM)
  message("Will make for ARM")

  set(CMAKE_SYSTEM_NAME Generic)
  set(CMAKE_CXX_COMPILER arm-linux-g++)
  set(CMAKE_C_COMPILER arm-linux-gcc)

  add_subdirectory(mshell)
...

Все скомпилилось нормально, но при линковке чет не понятно...
Цитировать
Linking CXX executable mshell
/usr/lib/gcc/arm-ip-linux-gnueabi/4.3.2/../../../../arm-ip-linux-gnueabi/bin/ld: warning: libQtNetwork.so.4, needed by /usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so, not found (try using -rpath or -rpath-link)
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::nextPendingConnection()'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::readData(char*, long long)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::canReadLine() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::setSocketDescriptor(int)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::hasPendingConnections() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::bytesAvailable() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::state() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpSocket::qt_metacast(char const*)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::flush()'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpSocket::QTcpSocket(QObject*)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::isSequential() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `typeinfo for QTcpServer'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpSocket::qt_metacall(QMetaObject::Call, int, void**)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::bytesToWrite() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::socketDescriptor() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpSocket::~QTcpSocket()'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::error(QAbstractSocket::SocketError)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::writeData(char const*, long long)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::readLineData(char*, long long)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::waitForBytesWritten(int)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::errorString() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::atEnd() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::setSocketDescriptor(int, QAbstractSocket::SocketState, QFlags<QIODevice::OpenModeFlag>)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::close()'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::incomingConnection(int)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::isListening() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::qt_metacall(QMetaObject::Call, int, void**)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::waitForReadyRead(int)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::qt_metacast(char const*)'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `typeinfo for QTcpSocket'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::~QTcpServer()'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::connected()'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpSocket::staticMetaObject'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::staticMetaObject'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QAbstractSocket::socketDescriptor() const'
/usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so: undefined reference to `QTcpServer::QTcpServer(QObject*)'
collect2: ld returned 1 exit status
make[2]: *** [mshell/mshell] Error 1
make[1]: *** [mshell/CMakeFiles/mshell.dir/all] Error 2
make: *** [all] Error 2

В QT_LIBRARIES толко вот что: /usr/local/Trolltech/Qt-4.6.0/lib/libQtGui.so;/usr/local/Trolltech/Qt-4.6.0/lib/libQtCore.so
Записан
tohisu
Гость
« Ответ #5 : Январь 27, 2010, 14:25 »

Это конечно не совсем правильно, но пока вот так удалось выкрутится:
set(QT_LIBRARIES "${QT_LIBRARIES};/usr/local/Trolltech/Qt-4.6.0/lib/libQtNetwork.so.4")

Хотелось бы по правильнее конечно...
Записан
Rcus
Гость
« Ответ #6 : Январь 27, 2010, 14:30 »

А если написать find_package(Qt4 COMPONENTS QtCore QtGui QtNetwork REQUIRED)? Я давно не пересобирал Qt и таких проблем не помню
Записан
tohisu
Гость
« Ответ #7 : Январь 27, 2010, 17:56 »

А если написать find_package(Qt4 COMPONENTS QtCore QtGui QtNetwork REQUIRED)? Я давно не пересобирал Qt и таких проблем не помню

Неа, не помогло. Ну да и фиг с ним Улыбающийся
сделал так:

Код:
if(${PLATFORM} STREQUAL QTARM)
  set(QT_LIBRARIES "${QT_LIBRARIES};${QT_LIBRARY_DIR}/libQtNetwork.so.4")
endif(${PLATFORM} STREQUAL QTARM)

Спасибо за помощь! Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.