CMakeListでQtプロジェクトを構築し、問題が発生したyuan

3972 ワード

このブログでは、CmakelistでQtプロジェクトを構築する際に発生する問題と、対応するソリューションについて説明します.
構築方法は左に曲がってブログを参照してください.https://blog.csdn.net/u013243710/article/details/36005539あ、よく書いてあるわ~

問題1.QT 4が見つかりません

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マクロ(QT 4_WRAP_CPP、QT 4_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ファイルを再コンパイルします.デバグおめでとう~

問題4既に定義されているSLOTが認識できない


Object::connect: No such slot QWidget::cansendSendButtonSlot()
理由:
Qtでは、クラスが信号/スロット機能を使用する場合、Q_を宣言する必要があります.OBJECT
だからQ_OBJECTは外せません
解決方法:
はい.hファイルのclassクラスに追加
    Q_OBJECT