【问题标题】:CMake error while linking链接时CMake错误
【发布时间】:2012-06-21 13:29:38
【问题描述】:

我对 CMake 还是很陌生,我正在尝试用它来构建一个小的 KDE 应用程序。我要使用QTXml模块,我的程序编译没有问题,但是在链接阶段,ld找不到QXml组件...

main.cpp

#include "test.h"

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

测试.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

我做错了什么?

【问题讨论】:

  • Addind SET(QT_USE_QTXML TRUE) 也不起作用

标签: c++ qt cmake kde4


【解决方案1】:

要使用 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})

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

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 库也是如此)。此外,您需要调用 include_directories,然后调用 FindQt4 模块并调用 included QT_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)

【讨论】:

  • 仍然无法链接,我正在认真考虑放弃 CMake 以换取其他自动工具,我已经在互联网上寻找了将近一整天,但没有找到解决方案
  • 在您运行 CMake 的目录中应该有一个名为 CMakeCache.txt 的文件。它将为QT_QTXML_LIBRARY 指定路径,这些路径是发布和调试 QtXml 库(QtXml4.lib 和 QtXmld4.lib)的位置。您能检查一下情况是否如此,它指定的文件是否确实存在?
  • cat CMakeCache.txt | grep QT_QTXML_LIBRARY QT_QTXML_LIBRARY_DEBUG:FILEPATH=QT_QTXML_LIBRARY_DEBUG-NOTFOUND QT_QTXML_LIBRARY_RELEASE:FILEPATH=/usr/lib/libQtXml.so //ADVANCED property for variable: QT_QTXML_LIBRARY_DEBUG QT_QTXML_LIBRARY_DEBUG-ADVANCED:INTERNAL=1 //ADVANCED property for variable: QT_QTXML_LIBRARY_RELEASE QT_QTXML_LIBRARY_RELEASE-ADVANCED:INTERNAL=1
  • 看起来你只有 QtXml 库的发布版本(QtCore 可能也是如此)。如果您尝试在发布模式下构建它应该可以工作:cmake . -D CMAKE_BUILD_TYPE=Release。如果是这种情况,您需要获取 Qt 的调试版本。你是如何安装现有的 Qt 库的?
  • 我知道,我认为我不需要应该稳定的 Qt 调试版本。即使将 CMAKE_BUILD_TYPe 设置为 RELEASE 模式,我仍然无法链接我的程序。今天够了,我放弃到明天
【解决方案2】:

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

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

你应该使用这个:

target_link_libraries(qtcmakepb ${QT_LIBRARIES})

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

【讨论】:

  • 感谢您的快捷方式,但链接阶段仍然失败
【解决方案3】:

你启用 QT_USE_QTXML 了吗?

试试:set(QT_USE_QTXML TRUE)

【讨论】:

  • 刚刚在您回答我的同时尝试过,并在评论中发布结果^^';
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多