用CMakeList 构建Qt 项目 及 遇到的问题yuan_qt cmakelists no build found in-程序员宅基地

技术标签: Qt  CMakeList  

本博文只是介绍在Cmakelist 构建Qt项目时遇到的问题,和对应的解决方案。

构建方法请出门左转,参考博客:https://blog.csdn.net/u013243710/article/details/36005539,写的很好很清楚~

问题1.找不到QT4
CMake Error at can_ui/CMakeLists.txt:121 (find_package):
  By not providing "FindQT4.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "QT4", but
  CMake did not find one.

  Could not find a package configuration file provided by "QT4" with any of
  the following names:

    QT4Config.cmake
    qt4-config.cmake

  Add the installation prefix of "QT4" to CMAKE_PREFIX_PATH or set "QT4_DIR"
  to a directory containing one of the above files.  If "QT4" provides a
  separate development package or SDK, be sure it has been installed.

解决方法:

修改

find_package(QT4 REQUIRED)

find_package(Qt4 REQUIRED)

大写Q,小写t。看清楚哦!!!!!!!

问题2:编译时 报错: error: undefined reference to ‘vtable for Widget'或‘vtable for XXX’

错误原因:没有正确的使用 moc。是CMakeLists.txt的问题

我的CMakeLists.txt是这么写的

find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
add_definitions(${QT_DEFINITIONS})

SET(can_ui_SOURCES src/can_ui.cpp src/widget.cpp)
SET(can_ui_HEADERS src/widget.h)
SET(can_ui_FORMS src/widget.ui)
#SET(CAN_UI_QRCS can_ui.qrc)
#SET(CAN_UI_SRCS can_ui.cpp widget.cpp ${CAN_UI_QRCS})


QT4_WRAP_CPP(can_ui_HEADERS_MOC ${can_ui_HEADERS})
QT4_WRAP_UI(can_ui_FORMS_HEADERS ${can_ui_FORMS})
#QT4_ADD_RESOURCES (CAN_UI_QRC_RCC     ${CAN_UI_QRCS})

add_executable(can_ui ${can_ui_SOURCES}
                      ${can_ui_HEADERS}
                      ${can_ui_FORMS})
#                      ${CAN_UI_QRC_RCC})

target_link_libraries(can_ui ${QT_LIBRARIES}
                             ${catkin_LIBRARIES})

add_dependencies(can_ui can_ui_generate_messages_cpp)

第17-19行 生成可执行文件时add_executable(),依赖的是自己写的源文件,并没有用到qt的moc。这里是有问题的。CMakelists并不能根据这些文件生成正常的可执行文件。

正确的做法是:依赖通过QT宏(QT4_WRAP_CPP,QT4_WRAP_UI等)生成的文件。

修改如下

find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
add_definitions(${QT_DEFINITIONS})

SET(can_ui_SOURCES src/can_ui.cpp src/widget.cpp)
SET(can_ui_HEADERS src/widget.h)
SET(can_ui_FORMS src/widget.ui)
#SET(CAN_UI_QRCS can_ui.qrc)
#SET(CAN_UI_SRCS can_ui.cpp widget.cpp ${CAN_UI_QRCS})


QT4_WRAP_CPP(can_ui_HEADERS_MOC ${can_ui_HEADERS})
QT4_WRAP_UI(can_ui_FORMS_HEADERS ${can_ui_FORMS})
#QT4_ADD_RESOURCES (CAN_UI_QRC_RCC     ${CAN_UI_QRCS})
add_executable(can_ui ${can_ui_SOURCES}
                      ${can_ui_HEADERS_MOC}
                      ${can_ui_FORMS_HEADERS})
#                      ${CAN_UI_QRC_RCC})
target_link_libraries(can_ui ${QT_LIBRARIES}
                             ${catkin_LIBRARIES})

add_dependencies(can_ui can_ui_generate_messages_cpp)

编译成功!

问题3 CMakeLists工程 不能使用debug调试

解决方法:在工程CMakeLists.txt 中添加以下内容

#如果要生成debug版本
SET(CMAKE_BUILD_TYPE "Debug")
#如果要生成release版本
#SET(CMAKE_BUILD_TYPE "Release")
#添加的支持debug和release支持
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

删除原来的.user文件,并重新编译。恭喜你可以debug啦~

问题4 已经定义的SLOT无法识别

Object::connect: No such slot QWidget::cansendSendButtonSlot()

原因:

           在Qt中,如果一个类要使用信号/槽功能,就必须在其中声明Q_OBJECT

           所以Q_OBJECT不可以去掉

解决方法:

           在.h文件的class类中添加

    Q_OBJECT

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a6513806/article/details/80228002

智能推荐

工业以太网EtherNet/IP协议安全分析整理-程序员宅基地

文章浏览阅读2.5k次。1、 EtherNet/IP : 设备可以用户数据报协议(UDP)的隐式报文传送基于IO的资料 ,用户传输控制协议(TCP)显示报文上传和下参数,设定值,程式 ,用户主站的轮询 从站周期性的更新或是改变状态COS,方便主站监控从站的状态,讯息会使用UDP的报文发送出去 特性: EnterNet/IP 工业以太网组成的系统具有兼容性和互操作性,资源共享能力强和传输距离远..._enternet ip隐式(i/o)报文通信错误

Python数学建模算法与应用(司守奎)--第4章随笔-程序员宅基地

文章浏览阅读901次,点赞3次,收藏10次。线性规划模型的一般形式或简写为其向量表示形式为其矩阵表示形式为其中,为目标函数的系数向量,又称为价值向量;为决策向量;为约束方程组的系数矩阵;为的列向量,又称约束方程组的系数向量;为约束方程组的常数向量。_python数学建模算法与应用

oracle怎么ping别人,在Oracle中,如何跟踪tnsping过程?-程序员宅基地

文章浏览阅读111次。A答案如下所示:sqlnet是oracle提供的与网络层面交互的一个工具,比如如何解析客户端发起的连接,如何对客户端发起的连接进行辨别,如何对客户端连接进行阻隔限制,或者启用日志及跟踪(log and trace)功能等等一系列的功能。所以,可以通过sqlnet工具对tnsping进行跟踪分析,查找为何外部网络无法连接数据库的原因。可以在客户端的sqlnet.ora中配置:tnsping.trac..._oracle 执行 ping

springcloudalibaba架构(15):Gateway自定义路由断言_gateway 自定义断言-程序员宅基地

文章浏览阅读971次。如果内置断言不满足我们的场景,如何自定义路由断言?我们知道了内置的断言,那么要自定义路由断言该如何操作呢?我们可以查看内置的断言如何实现?举例:BetweenRoutePredicateFactoryCtrl+NIDEA查找类知道内置路由断言的实现细节,我们只需要按照它的实现方式,来按部就班的实现自己的路由断言即可。下面我们就实现一个自己的路由断言。需求假设: 大于16岁,并且小于60岁,才能访问。先进行路由配置。......_gateway 自定义断言

C语言三角形的判断代码_c语言判断三角形类型等腰直角三角形-程序员宅基地

文章浏览阅读371次。C语言三角形的判断代码_c语言判断三角形类型等腰直角三角形

linux 迁移文件windows,如何完成Linux文件系统与Windows文件系统间的迁移?-程序员宅基地

文章浏览阅读386次。我常常遇到这样的情况:服务器上已经有可悲的是,这样的转换几乎是不可能的,而且我认为这在将来也不会成为可能。很多原因导致该功能在最初不会是一个好想法,而且它会变得越来越不必要。下面就是原因。一开始,磁盘格式的就地转换本身就很危险。当你在给定系统唯一可用的副本上工作时,这是颇具风险的行为。你相信该程序可以立刻操控整个卷,不会有多大失误。如果转换期间某部分出错了,该数据的唯一副本就破坏了。此外,如果该数..._文件系统 ext3怎么把数据导到window

随便推点

matlab时频分析之短时傅里叶变换 spectrogram_matlab短时傅里叶变换-程序员宅基地

文章浏览阅读6.8w次,点赞117次,收藏913次。matlab时频分析之短时傅里叶变换 spectrogram短时傅里叶变换常用于缓慢时变信号的频谱分析,可以观察沿时间变化的频谱信号。其优点如下图所示,弥补了频谱分析中不能观察时间的缺点,也弥补了时域分析不能获取频率的缺点。1 STFT的基本原理基本原理可以理解为对一段长信号,截取每一段时间的短信号做fft,将得到的频谱图时间沿时间轴排列,及可得到时频的云图。2 matlab中实现..._matlab短时傅里叶变换

42岁程序员面试,Java并发编程必会的多线程你竟然还不会_42岁求职java工程师-程序员宅基地

文章浏览阅读88次。前言很多Java程序员一直希望找到一份完整的学习路径,但是市面上很多书都是专注某一个领域的,没有一份完整的大图,以至于很多程序员很迷茫,不知道自己到底应该从哪里开始学,或者不知道自己学习些什么。好在,很早之前就有一位阿里巴巴的技术专家总结了一份**《Java工程师成神之路》**,作者按照自己的经验总结了从基础,到高级、底层、架构、进阶、扩展等6个大的章节。几乎囊括了Java体系内的所有知识点。这份资料之前开源在GitHub上,短短几个月时间,收获了15k+的Star数,最近,笔者了解到,该项目有了重大_42岁求职java工程师

UGUI案例篇第(三)节:UGUI实现3D轮转图效果-程序员宅基地

文章浏览阅读2.9k次,点赞11次,收藏23次。UGUI三种实现规则与不规则图形Button精准点击效果的策略)(一) 为什么需要精准点击?(二) 3种实现规则与不规则图形Button精准点击效果的方案1. 所有图形button都适用的官方解决方案。 实现原理 实现步骤 优点 缺点2.所有图形都适用的Ray-Crossing算法策略。 实现原理重点介绍: 实现步骤优点 缺点3.圆形除外(圆形实现不易精确)的其他图形都适用的绘制碰撞体方案实现原..._ugui案例

样条曲线_Solidworks中如何完全定义样条曲线-程序员宅基地

文章浏览阅读9.2k次。常规的草图线大家都知道如何完全定义,但是样条曲线可能不知道。下面就来说一说吧。我这里用的是solidworks2018软件。创建草图在前视基准面上画草图,其中有两条直线和一条样条曲线。下面的直线中点与原点相重合。而且下面的草图的完全定义的,就是无法移动了。样条曲相关我们上面画的样条曲线有三个控标,分别在100、200、100处各有一个点,可以用智能尺寸去标注控标处的点的距离,如上图所示,标注了左右..._sw样条曲线怎么完全定义

5天不再惧怕多线程——第三天 互斥体_sdk互斥体-程序员宅基地

文章浏览阅读816次。作者:一线码农转自:http://www.cnblogs.com/huangxincheng/archive/2012/03/16/2402320.html_sdk互斥体

VSCode GDB调试配置_vscode debug 参数-程序员宅基地

文章浏览阅读3.2w次,点赞6次,收藏39次。VSCode GDB调试配置1. vscode启动debug窗口按Ctrl+Shift+D,打开Debug窗口默认是“No configurations”, 点击“F5”,会提示你配置GDB参数(选择gcc build and debug active file),配置文件名称为launch.json(配置参考3)配置完成后,再按F5, 会提示配置GCC,选择“Configure Task..._vscode debug 参数

推荐文章

热门文章

相关标签