QT5 qmake工程转换cmake工程总结
【摘要】 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并引用需要注意的几点
- 通过add_subdirectory添加opencv源码包含cmakelist.txt的目录,如果在外部需要添加第二个参数例如
${CMAKE_CURRENT_BINARY_DIR}/opencv
- target_link_libraries 添加opencv_core opencv_imgproc opencv_imgcodecs
- 需要人为添加opencv的引用目录
target_include_directories(目标 PUBLIC
${CMAKE_SOURCE_DIR}/…/opencv-4.2.0/modules/calib3d/include
…) - 由于是作为项目的一部分不能使用如下的方式
#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)