#使用qt Creator 创建Cmake 项目,使用Cmake Gui 生成sln 工程,使用Visual Studio 开发
##使用qt Creator 创建CMake项目
和创建pro工程的步骤一致,只是在选择构建系统的步骤上选择CMake,接下来步骤完全相同
工程新建完成之后,构建cmake 项目,保证项目被正确的构建。
在qt creator 自动生成的CMakeLists.txt 上做了修改,添加了自动寻找头文件、源文件和ui文件
当前文件夹是CMakeLists.txt 的同级目录
cmake_minimum_required(VERSION 3.5)
project(cmakeTest VERSION 0.1 LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
#添加源文件 头文件 和ui文件
FILE(GLOB SRC_FILES "./*.cpp" "../cmakeTest_Build/*.cpp")
FILE(GLOB HEAD_FILES "./*.h" "./cmakeTest_Build/*.h")
FILE(GLOB UI_FILES "./*.ui" "../cmakeTest_Build/*.ui")
#可以不设置
#qt5_wrap_ui(WRAP_UI ${UI_FILES})
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(cmakeTest
MANUAL_FINALIZATION
${HEAD_FILES}
${SRC_FILES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET cmakeTest APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(cmakeTest SHARED
${HEAD_FILES}
${SRC_FILES}
${UI_FILES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(cmakeTest
${HEAD_FILES}
${SRC_FILES}
${UI_FILES}
)
endif()
endif()
target_link_libraries(cmakeTest PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.cmakeTest)
endif()
set_target_properties(cmakeTest PROPERTIES
${BUNDLE_ID_OPTION}
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
include(GNUInstallDirs)
install(TARGETS cmakeTest
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(cmakeTest)
endif()
##使用cmake_gui 构建出sln 工程
依次操作1,2,3,4
1.设置CMakeLists.txt 所在的目录
2.设置build 目录 生成visual studio 可以打开的sln,以及整个项目的构建过程
3.configure 配置visual studio 工具,选择生成的平台,(点击之后如果有红色在5处出现,再次点击config,直到消失,如果是下方的空白处有红色就需要根据提示修改CMakeLists.txt文件)
4.configure 完成之后 点击Generate
操作完成!!!
##使用visual studio 打开cmake 构建目录下的sln 文件,解决 方案资源管理器中有好几个项目选择指定的工程名的项目作为启动项,否在编译会出现
设置启动项之后成功运行。
##在visual studio 项目中添加文件,添加文件设置文件的位置和CMakeLists.txt同一级目录,方便拷贝代码。添加完成之后,运行会提示ui_XX.h 找到不到
重复 cmake_gui 构建出sln 工程 的3,4 步骤,visual 提示
点击全部重新加载,点击运行成功编译.
添加文件每次都需要使用cmake 重新构建,暂时没有找到好的方法
add: 在CMakeLists.txt的上一级目录添加.bat 脚本
rem @echo 不显示命令在命令行窗口上 echo 显示
echo off
rem 改批处理文件
rem 获取批处理文件的名称(不包括路劲)
set "file_name=%~nx0"
rem 去除批处理文件的后缀
for %%F in ("%file_name%") do set "file_name_no_ext=%%~nF"
set "file_name_build=%file_name_no_ext%_build"
rem :: 表示当前行为注释 不执行
::delete %file_name_build%
if "%1"=="delete" goto _DEL
if not exist %file_name_build% md %file_name_build%
cd %file_name_build%
cmake -A Win32 -DCMAKE_CONFIGURATION_TYPES=Release ../%file_name_no_ext%
cd ..
goto _END
echo %file_name_no_ext%
:_DEL
rd /S /Q %file_name_build%
:_END
pause