QT5 qmake工程转换cmake工程总结

举报
Amrf 发表于 2022/10/14 20:20:58 2022/10/14
【摘要】 QT5 qmake工程转换cmake工程总结 qt6有个脚本工具可以做这个转换,用来转换qt5的工程发现基本上没啥用,本来工程结构也不太复杂,手动转换了下,总结一下; 添加工程名project(工程名 CXX C) 修改cmake编译二进制输出目录set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/../bin/) 添加cmake子...

QT5 qmake工程转换cmake工程总结

qt6有个脚本工具可以做这个转换,用来转换qt5的工程发现基本上没啥用,本来工程结构也不太复杂,手动转换了下,总结一下;

添加工程名

project(工程名 CXX C)

修改cmake编译二进制输出目录

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/../bin/)

添加cmake子依赖目录

add_subdirectory(${CMAKE_SOURCE_DIR}/opencv-4.2.0 ${CMAKE_CURRENT_BINARY_DIR}/opencv)

debug版本的库文件文件名添加后缀d,对可执行文件输出无效

set(CMAKE_DEBUG_POSTFIX d)

如果希望可执行目标debug编译也添加后缀d则

set_target_properties(
  目标A 目标B
  PROPERTIES
  DEBUG_POSTFIX "${CMAKE_DEBUG_POSTFIX}"
)

msvc添加utf8选项

add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")

指定c++17编译

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

添加宏

add_definitions(-D_WIN32_WINNT=0x0602 -DWINVER=0x0602 -D_WINSOCKAPI_)

qt5 cmake 适配修改

find_package(Qt5 COMPONENTS Core Gui Network Sql Qml Quick Charts Widgets REQUIRED)
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" OR CMAKE_COMPILER_IS_GNUCXX)
    find_package(Qt5 COMPONENTS WebEngineWidgets REQUIRED)
endif()
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

qt5资源文件比较大时需要,并且需要添加到目标的add_executable源中

qt5_add_big_resources(SRC_FILES ${CMAKE_SOURCE_DIR}/xxx.qrc)

添加链接qt5组件和opencv组件

target_link_libraries(目标 PUBLIC Qt5::Gui Qt5::Network Qt5::Core Qt5::Charts)

多目录引用xxx.ui 自动moc生成的ui_xxx.h编译会报找不到相应的头文件,可以通过下面的添加

set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_SOURCE_DIR}/xxx.ui的位置 )
set(AUTOMOC_PATH_PREFIX ON)

添加额外的include查找目录

include_directories(${CMAKE_SOURCE_DIR}/x ${CMAKE_SOURCE_DIR}/y)

target_include_directories(目标 PUBLIC ${CMAKE_SOURCE_DIR}/)

添加链接查找目录

link_directories(${CMAKE_SOURCE_DIR}/xxx/lib/)

编译前从网络中下载二进制依赖,编译时可以看到目标目录中多了-src后缀的目录,并且tar包被解压在其中

include(FetchContent)
set(FETCHCONTENT_BASE_DIR ${CMAKE_SOURCE_DIR}/xx/yy/)
FetchContent_Declare(
  XXX_RUNTIME
  URL      http://xxxx/yy.tar.gz
  URL_HASH MD5=f..f9ea
)
FetchContent_MakeAvailable(XXX_RUNTIME)

递归引用目录下的所有符合通配的文件

file(GLOB_RECURSE Sources ${CMAKE_SOURCE_DIR}/*.cpp)

编译完成后执行目录拷贝

add_custom_command(TARGET 目标 POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_BINARY_DIR}/bin/ ${CMAKE_SOURCE_DIR}/../)

设置可执行的目标

add_executable(目标 ${SourcesA} ${HeadersB})

编译前新建目录

file(MAKE_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/xxx/)

copy_directory覆盖已有目录会报错可以采用自定义目标规避

add_custom_target(copy_assets
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/copy-assets.cmake
)
add_dependencies(目标 copy_assets)

copy-assets.cmake内容

file(COPY ${CMAKE_CURRENT_LIST_DIR}/XXX/ DESTINATION ${CMAKE_CURRENT_LIST_DIR}/YYY/)

在qt工程直接源码编译opencv并引用需要注意的几点

  1. 通过add_subdirectory添加opencv源码包含cmakelist.txt的目录,如果在外部需要添加第二个参数例如${CMAKE_CURRENT_BINARY_DIR}/opencv
  2. target_link_libraries 添加opencv_core opencv_imgproc opencv_imgcodecs
  3. 需要人为添加opencv的引用目录
    target_include_directories(目标 PUBLIC
    ${CMAKE_SOURCE_DIR}/…/opencv-4.2.0/modules/calib3d/include
    …)
  4. 由于是作为项目的一部分不能使用如下的方式
#find_package(OpenCV REQUIRED)
#add_library(opencv INTERFACE)
#include_directories(${OpenCV_INCLUDE_DIRS})
#target_include_directories(opencv INTERFACE "${OpenCV_INCLUDE_DIRS}")
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。