4

私は CMake を初めて使用し、それを使用して小さな KDE アプリケーションを構築しようとしています。QTXml モジュールを使用する必要があり、プログラムは問題なくコンパイルされますが、リンク段階で ld は QXml コンポーネントを見つけることができません...

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} )

make の出力:

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

私は何を間違っていますか?

4

3 に答える 3

3

CMake のFindQt4 モジュールを使用するには、次の手順を実行します。

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. さらに、FindQt4 モジュールを呼び出して .dを呼び出しinclude_directories た後に呼び出す必要があります。includeQT_USE_FILE

お使いのバージョンの CMake で提供される FindQt4 モジュールの詳細については、次を実行してください。

cmake --help-module FindQt4


編集

根本的な原因は、実際には未定義の関数が 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)
于 2012-06-19T16:06:52.643 に答える
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)。警告: 複数のターゲットを異なる Qt コンポーネントのセットにリンクする場合、これは機能しません。

于 2012-06-19T14:38:08.647 に答える
0

QT_USE_QTXML を有効にしましたか?

試す:set(QT_USE_QTXML TRUE)

于 2012-06-19T13:53:26.733 に答える