首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接时出现CMake错误

链接时出现CMake错误
EN

Stack Overflow用户
提问于 2012-06-19 21:37:30
回答 3查看 3.4K关注 0票数 4

我是CMake的新手,我正试着用它来构建一个小的KDE应用程序。我不得不使用QTXml模块,我的程序编译没有问题,但在链接阶段,我找不到QXml组件…

main.cpp

代码语言:javascript
复制
#include "test.h"

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

test.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
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的输出:

代码语言:javascript
复制
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

我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-20 00:06:53

要使用CMake的FindQt4 module,请执行以下操作:

代码语言:javascript
复制
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})

如果要指定单独的包含目录和库,请将上面的最后两行替换为:

代码语言:javascript
复制
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模块和included QT_USE_FILE之后调用include_directories

有关随您的CMake版本提供的FindQt4模块的完整信息,请运行:

代码语言:javascript
复制
cmake --help-module FindQt4

编辑

事实证明,根本原因实际上是未定义的函数是QtXmlPatterns库的一部分,因此find_package调用应该在列表中包含QtXmlPatterns

完成后,通过调用include(${QT_USE_FILE})设置变量${QT_QTXMLPATTERNS_INCLUDE_DIR}${QT_QTXMLPATTERNS_LIBRARY},并可以根据需要添加它们。

如果使用的是QT5,则为

有了Qt5,使用CMake变得更简单了。

为了包含和链接QtXml和QtXmlPatterns,您只需要以下几行:

代码语言:javascript
复制
find_package(Qt5Xml REQUIRED)
find_package(Qt5XmlPatterns REQUIRED)

并按如下方式链接:

代码语言:javascript
复制
target_link_libraries(qtcmakepb Qt5::Xml Qt5::XmlPatterns)
票数 3
EN

Stack Overflow用户

发布于 2012-06-19 21:53:27

您启用QT_USE_QTXML了吗?

尝试:set(QT_USE_QTXML TRUE)

票数 0
EN

Stack Overflow用户

发布于 2012-06-19 22:38:09

不知道这是否有帮助,但是:

代码语言:javascript
复制
target_link_libraries(qtcmakepb ${QT_QTCORE_LIBS})
target_link_libraries(qtcmakepb ${QT_QTXML_LIBS})

您需要使用以下代码:

代码语言:javascript
复制
target_link_libraries(qtcmakepb ${QT_LIBRARIES})

这会将您选择的所有内容与find_package(Qt4)中的COMPONENTS子句链接起来。Cave-at:如果您将多个目标与不同的Qt组件集链接在一起,这将不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11102151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档