- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 CMake 的新手,我正在尝试使用它来构建一个小的 KDE 应用程序。我必须使用 QTXml 模块,我的程序编译没有问题,但在链接阶段,ld 找不到 QXml 组件...
主要.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
测试.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
我做错了什么?
最佳答案
使用 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 模块和 include
dQT_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)
关于c++ - CMake 链接时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11102151/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!