2012-06-19 5 views
2

Я совершенно новый для CMake, и я пытаюсь использовать его для создания небольшого приложения KDE. Я использовать модуль QtXml, моя программа не компилируется без проблем, но во время стадии компоновки, л.д. не найти компоненты QXml ...Ошибка CMake при связывании

main.cpp

#include "test.h" 

int main(int argc, char **argv) 
{ 
    return 0; 
} 

test.h

#ifndef TEST_H 
#define TEST_H 

#include <QXmlResultItems> 
#include <QString> 
#include <QBuffer> 
#include <QXmlQuery> 

class test { 
public: 
    test(){} 
    ~test(){} 
    QXmlResultItems* find (const QString& node, const QString& xpath); 
private: 
    QBuffer device_; 
}; 

#endif // TEST_H 

test.cpp

#include "test.h" 

QXmlResultItems* test::find (const QString& node, const QString& xpath) 
{ 
    QXmlResultItems* result = new QXmlResultItems; 
    QXmlQuery query; 
    query.bindVariable ("device",&device_); 
    query.setQuery ("doc($device)/"+node+"/"+xpath); 
    query.evaluateTo (result); 
    return result; 
} 

CMakeLists.cmake

project(qtcmakepb) 

find_package(KDE4 REQUIRED) 
include (KDE4Defaults) 

include_directories(${KDE4_INCLUDES} ${QT_INCLUDES}) 
#Supposed to be useless because of KDE4 REQUIRED and ${QT_INCLUDES} 
find_package(Qt4 COMPONENTS QtCore QtXml REQUIRED) 


# In this CMakeLists.txt we define which files 
# are used to compile the application 
set(qtcmakepb_SRCS main.cpp test.cpp) 


# Set the name of the application 
kde4_add_executable(qtcmakepb ${qtcmakepb_SRCS}) 

# Select which libraries we need to link to 
target_link_libraries(qtcmakepb ${KDE4_KDEUI_LIBS}) 
target_link_libraries(qtcmakepb ${QT_QTCORE_LIBS}) 
target_link_libraries(qtcmakepb ${QT_QTXML_LIBS}) 

# Tell cmake to install the application binary 
install(TARGETS qtcmakepb ${INSTALL_TARGETS_DEFAULT_ARGS}) 

# Install the .desktop file 
install(PROGRAMS qtcmakepb.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) 

выход для макияжа:

Linking CXX executable qtcmakepb 
CMakeFiles/qtcmakepb.dir/test.o: In function `test::find(QString const&, QString const&)': 
/home/zelwina/projects/QtCmakePb/src/test.cpp:5: undefined reference to `QXmlResultItems::QXmlResultItems()' 
/home/zelwina/projects/QtCmakePb/src/test.cpp:6: undefined reference to `QXmlQuery::QXmlQuery()' 
/home/zelwina/projects/QtCmakePb/src/test.cpp:7: undefined reference to `QXmlQuery::bindVariable(QString const&, QIODevice*)' 
/home/zelwina/projects/QtCmakePb/src/test.cpp:8: undefined reference to `QXmlQuery::setQuery(QString const&, QUrl const&)' 
/home/zelwina/projects/QtCmakePb/src/test.cpp:9: undefined reference to `QXmlQuery::evaluateTo(QXmlResultItems*) const' 
/home/zelwina/projects/QtCmakePb/src/test.cpp:10: undefined reference to `QXmlQuery::~QXmlQuery()' 
collect2: erreur: ld a retourné 1 code d'état d'exécution 
make[2]: *** [src/qtcmakepb] Erreur 1 
make[1]: *** [src/CMakeFiles/qtcmakepb.dir/all] Erreur 2 
make: *** [all] Erreur 2 

Что я делаю неправильно?

+0

Addind SET (QT_USE_QTXML ИСТИНА) не работает либо – Zelwina

ответ

2

Использование CMake-х FindQt4 module, выполните следующие действия:

find_package(Qt4 COMPONENTS QtCore QtXml REQUIRED) 
include(${QT_USE_FILE}) 
include_directories(${KDE4_INCLUDES} ${QT_INCLUDES}) 
target_link_libraries(qtcmakepb ${KDE4_KDEUI_LIBS} ${QT_LIBRARIES}) 

Если вы хотите, чтобы указать лицо включают в себя каталоги и библиотеки, а затем заменить последние 2 строки выше:

include_directories(${KDE4_INCLUDES} 
        ${QT_QTCORE_INCLUDE_DIR} 
        ${QT_QTXML_INCLUDE_DIR}) 
target_link_libraries(qtcmakepb 
         ${KDE4_KDEUI_LIBS} 
         ${QT_QTCORE_LIBRARY} 
         ${QT_QTXML_LIBRARY}) 

Ваша проблема заключается в том, что вы не вызываете include(${QT_USE_FILE}), и что QT_QTCORE_LIBS должен быть QT_QTCORE_LIBRARY (и аналогичным образом для библиотеки QtXml). Кроме того, вам необходимо позвонить после вы вызывают модуль FindQt4 и include d QT_USE_FILE.

Для получения полной информации о модуле FindQt4, поставляемой с версией CMake, запустите:

cmake --help-module FindQt4 


EDIT

Оказывается, что основной причиной является на самом деле, что неопределенные функции являются частью библиотеки QtXmlPatterns, поэтому вызов find_package должен содержать QtXmlPatterns в списке.

Когда это делается, переменные ${QT_QTXMLPATTERNS_INCLUDE_DIR} и ${QT_QTXMLPATTERNS_LIBRARY} устанавливаются по вызову include(${QT_USE_FILE}) и могут быть добавлены по мере необходимости.

Если вы используете QT5

С Qt5, используя CMake становится проще.

Для того, чтобы включить и связать QtXml и QtXmlPatterns, вам нужно только эти строки:

find_package(Qt5Xml REQUIRED) 
find_package(Qt5XmlPatterns REQUIRED) 

и соединяющими следующим образом:

target_link_libraries(qtcmakepb Qt5::Xml Qt5::XmlPatterns) 
+0

Все еще не могу связаться, я серьезно подумываю о том, чтобы отказаться от CMake для других автоинструментов, я искал по интернету почти целый день, не найдя решения – Zelwina

+0

Должен быть файл в каталоге, в котором вы запускаете CMake из вызываемого CMakeCache.txt. Он будет иметь пути, указанные для 'QT_QTXML_LIBRARY', которые являются местоположениями выпуска и debug QtXml libs (QtXml4.lib и QtXmld4.lib). Можете ли вы проверить, что это так, и что файлы, которые он определяет, действительно существуют? – Fraser

+0

'cat CMakeCache.txt | Grep QT_QTXML_LIBRARY QT_QTXML_LIBRARY_DEBUG: FILEPATH = QT_QTXML_LIBRARY_DEBUG-NOTFOUND QT_QTXML_LIBRARY_RELEASE: FILEPATH =/USR/Библиотека/libQtXml.so // ADVANCED свойства для переменного: QT_QTXML_LIBRARY_DEBUG QT_QTXML_LIBRARY_DEBUG-Advanced: ВНУТРЕННЕЕ = 1 // Расширенного свойства для переменного: QT_QTXML_LIBRARY_RELEASE QT_QTXML_LIBRARY_RELEASE-ADVANCED: INTERNAL = 1' – Zelwina

0

Включили ли вы QT_USE_QTXML?

Try: set(QT_USE_QTXML TRUE)

+0

Просто попробовал это в то же время, когда вы ответили мне и опубликовали результат в комментарии ^^ '; – Zelwina

0

Не знаю, если это помогает, но:

target_link_libraries(qtcmakepb ${QT_QTCORE_LIBS}) 
target_link_libraries(qtcmakepb ${QT_QTXML_LIBS}) 

Вы должны использовать это:

target_link_libraries(qtcmakepb ${QT_LIBRARIES}) 

Это связывает все, что вы выбрали с пункт COMPONENTS в find_package(Qt4). Cave-at: Это не сработает, если вы связываете несколько целей с различными наборами компонентов Qt.

+0

Спасибо за ярлык, но ссылка на фазу еще не сработала – Zelwina

Смежные вопросы