【Qt】【Xcode】【CMake】-Qt5_DIR-NOTFOUND的解决方法

本文介绍如何在Xcode环境中使用CMake配置Qt项目。主要解决CMake启动后出现的Qt5_DIR-NOTFOUND错误。通过正确设置CMAKE_INSTALL_PREFIX为Qt安装目录,可以顺利进行配置和生成。

【Qt】【Xcode】【CMake】-Qt5_DIR-NOTFOUND的解决方法

希望用Xcode编译Qt的CMake项目。

【报错】:

CMake启动后,直接点击按钮:generate,会报错:

Qt5_DIR-NOTFOUND

【解决】:

1.在CMake中,设置如下:

CMAKE_INSTALL_PREFIX 设置为Mac上安装的Qt目录即可。

如:本人安装的Qt路径为:/Users/goodmao/Qt_all_version/Qt5.15.4/5.15.4

CMake启动后,设置如下图:

 2.点击configure,不再报错

3.点击generate,成功。

cmake_minimum_required(VERSION 3.20) # 设置项目名称和版本 project(DTENApp LANGUAGES CXX VERSION 1.1.2.0729) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找 Qt6 find_package(Qt6 REQUIRED COMPONENTS Quick Widgets Sql Multimedia) qt_standard_project_setup(REQUIRES 6.5) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # 只在 Xcode 生成器中设置代码签名 if(CMAKE_GENERATOR STREQUAL "Xcode") set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "") set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY_RELEASE "Apple Distribution") set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO") set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH "YES") endif() # 设置第三方库路径 set(DTENLog_DIR "${CMAKE_SOURCE_DIR}/thirdpart/DTENLog") set(DTENLog_INCLUDE_DIRS "${DTENLog_DIR}/include/mac") set(ChannelMgr_DIR "${CMAKE_SOURCE_DIR}/thirdpart/ChannelMgr/mac") set(ChannelMgr_INCLUDE_DIRS "${ChannelMgr_DIR}/include") # 设置库文件路径 if(APPLE) set(DTENLog_LIBRARY "${DTENLog_DIR}/lib/libglog.dylib") set(ChannelMgr_LIBRARY "${ChannelMgr_DIR}/lib/libChannelMgr.dylib") else() set(DTENLog_LIBRARY "${DTENLog_DIR}/lib/DTENLog.lib") endif() # 平台特定配置 if(WIN32) message(STATUS "Windows platform detected, configuring version info...") set(MY_VERSIONINFO_RC "${CMAKE_CURRENT_SOURCE_DIR}/VersionInfo.rc") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/VersionInfo.rc.in" "${MY_VERSIONINFO_RC}") list(APPEND SOURCES ${MY_VERSIONINFO_RC}) if(MSVC) set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") endif() qt_add_executable(${PROJECT_NAME} WIN32 Main.cpp logo.rc ${MY_VERSIONINFO_RC} ) elseif(APPLE) message(STATUS "macOS platform detected, configuring bundle...") # macOS 特定设置 set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++17") set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++") # 创建应用程序包 set(MACOSX_BUNDLE_BUNDLE_NAME "DTENApp") set(MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") set(MACOSX_BUNDLE_COPYRIGHT "Copyright © 2023 My Company") set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.dten.${PROJECT_NAME}") set(MACOSX_BUNDLE_ICON_FILE "AppIcon") # 添加可执行文件 add_executable(${PROJECT_NAME} MACOSX_BUNDLE Main.cpp) # 设置目标属性 set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Mac/Info.plist XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/Mac/DTENApp.entitlements" BUNDLE True MACOSX_BUNDLE True ) # 添加资源文件 set(RESOURCE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/images/DTENApp.icns" "${CMAKE_CURRENT_SOURCE_DIR}/qml.qrc" ) # 复制资源文件到 bundle foreach(resource ${RESOURCE_FILES}) get_filename_component(resource_name ${resource} NAME) set_source_files_properties(${resource} PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) target_sources(${PROJECT_NAME} PRIVATE ${resource}) endforeach() # 链接 macOS 框架 find_library(COCOA_LIBRARY Cocoa) find_library(FOUNDATION_LIBRARY Foundation) find_library(IOKIT_LIBRARY IOKit) find_library(CARBON_LIBRARY Carbon) target_include_directories(${PROJECT_NAME} PRIVATE ${DTENLog_DIR} ${DTENLog_INCLUDE_DIRS} "${ChannelMgr_INCLUDE_DIRS}" ) target_link_libraries(${PROJECT_NAME} PRIVATE ${COCOA_LIBRARY} ${FOUNDATION_LIBRARY} ${IOKIT_LIBRARY} ${CARBON_LIBRARY} ${DTENLog_LIBRARY} ${ChannelMgr_LIBRARY} ) # 添加 rpath 以便在 macOS 上找到 Qt 库 set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "@executable_path/../Frameworks" BUILD_WITH_INSTALL_RPATH TRUE MACOSX_RPATH ON ) # 自动复制库到程序的 Frameworks 目录 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory "$<TARGET_FILE_DIR:${PROJECT_NAME}>/../Frameworks" COMMAND ${CMAKE_COMMAND} -E copy "${DTENLog_LIBRARY}" "${ChannelMgr_LIBRARY}" "$<TARGET_FILE_DIR:${PROJECT_NAME}>/../Frameworks/" COMMENT "Copied libraries to Frameworks" ) endif() # 添加 QML 模块 qt_add_qml_module(${PROJECT_NAME} URI DTENApp VERSION 1.0 QML_FILES Main.qml RESOURCES qml.qrc SOURCES LogInit.h userdefdata.h DeviceControl.h DeviceControl.cpp DealChannelMsg.h DealChannelMsg.cpp CreateChannelMsg.h CreateChannelMsg.cpp FileInfo.h FileInfo.cpp WindowManager.h WindowManager.cpp ProcessManager.h ProcessManager.cpp TaskQueue.h TaskQueue.cpp DeviceCheck.h DeviceCheck.cpp Interface.h Interface.cpp NetworkManager.h NetworkManager.cpp NV12VideoSource.h NV12VideoSource.cpp DBManager.h DBManager.cpp CameraControl.h CameraControl.cpp UdpClient.h UdpClient.cpp ) # 链接库 target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Quick Qt6::Widgets Qt6::Sql Qt6::Multimedia ${DTENLog_LIBRARY} ${ChannelMgr_LIBRARY} ) # 添加宏定义 target_compile_definitions(${PROJECT_NAME} PRIVATE GLOG_NO_ABBREVIATED_SEVERITIES ) # 在 macOS 上添加额外的链接选项 if(APPLE) # 确保链接器能找到 Qt 框架 target_link_options(${PROJECT_NAME} PRIVATE -F${Qt6_DIR}/../../.. ) # 添加必要的框架 target_link_libraries(${PROJECT_NAME} PRIVATE "-framework AppKit" "-framework Foundation" "-framework CoreGraphics" "-framework CoreVideo" "-framework CoreMedia" "-framework OpenGL" "-framework IOKit" "-framework Carbon" ) # 查找 macdeployqt 工具 get_target_property(QMAKE_LOCATION Qt6::qmake IMPORTED_LOCATION) get_filename_component(QT_BIN_DIR "${QMAKE_LOCATION}" DIRECTORY) find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${QT_BIN_DIR}") if(MACDEPLOYQT_EXECUTABLE) message(STATUS "Found macdeployqt: ${MACDEPLOYQT_EXECUTABLE}") set(QT_MACDEPLOYQT_EXECUTABLE "${MACDEPLOYQT_EXECUTABLE}") else() message(WARNING "macdeployqt not found - manual deployment required") endif() # QML 文件部署 set(QML_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH "Directory containing QML files") # 查找 QML 文件 file(GLOB_RECURSE QML_FILES "${QML_SOURCE_DIR}/*.qml" "${QML_SOURCE_DIR}/*.qmlc" ) if(QML_FILES) # 安装 QML 文件(保持目录结构) foreach(QML_FILE ${QML_FILES}) file(RELATIVE_PATH RELATIVE_QML_PATH "${QML_SOURCE_DIR}" "${QML_FILE}") get_filename_component(RELATIVE_DIR "${RELATIVE_QML_PATH}" DIRECTORY) install(FILES "${QML_FILE}" DESTINATION "${PROJECT_NAME}.app/Contents/Resources/qml/${RELATIVE_DIR}" COMPONENT Runtime ) endforeach() # 统计信息 list(LENGTH QML_FILES QML_FILES_COUNT) message(STATUS "Installed ${QML_FILES_COUNT} QML files") # 部署 QML 导入路径 execute_process( COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_QML OUTPUT_VARIABLE QT_QML_IMPORT_PATH OUTPUT_STRIP_TRAILING_WHITESPACE ) # 修正:部署正确的 QML 模块(Widgets、Sql、Multimedia 是 C++ 库,不是 QML 模块) set(QML_MODULES_TO_DEPLOY QtQuick QtQuick/Controls QtQuick/Layouts QtMultimedia # 多媒体 QML 模块 # 添加您的项目所需的其他 QML 模块 ) foreach(MODULE ${QML_MODULES_TO_DEPLOY}) if(EXISTS "${QT_QML_IMPORT_PATH}/${MODULE}") install(DIRECTORY "${QT_QML_IMPORT_PATH}/${MODULE}" DESTINATION "${PROJECT_NAME}.app/Contents/Resources/qml" COMPONENT Runtime ) message(STATUS "Deploying QML module: ${MODULE}") else() message(WARNING "QML module not found: ${MODULE}") endif() endforeach() else() message(WARNING "No QML files found in ${QML_SOURCE_DIR} and its subdirectories") endif() # 在安装后运行 macdeployqt 以确保所有依赖项正确部署 if(QT_MACDEPLOYQT_EXECUTABLE) install(CODE " execute_process( COMMAND ${QT_MACDEPLOYQT_EXECUTABLE} \"\${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.app\" -always-overwrite -verbose=1 -qmldir=\"${QML_SOURCE_DIR}\" WORKING_DIRECTORY \"\${CMAKE_INSTALL_PREFIX}\" RESULT_VARIABLE DEPLOY_RESULT ) if(NOT DEPLOY_RESULT EQUAL 0) message(WARNING \"macdeployqt failed with return code: \${DEPLOY_RESULT}\") else() message(STATUS \"macdeployqt completed successfully\") endif() ") endif() endif() # 安装规则 - 对于 macOS bundle if(APPLE) install(TARGETS ${PROJECT_NAME} BUNDLE DESTINATION . COMPONENT Runtime) endif() 这个是cmake文件,现在我用qt构建完成后,运行时提示 14:24:19: Starting /Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/MacOS/DTENApp... dyld[43125]: Library not loaded: @rpath/QtQuick.framework/Versions/A/QtQuick Referenced from: <547B041F-84D0-3E82-86DA-BDE25EE00048> /Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/MacOS/DTENApp-1.1.2.0729 Reason: tried: '/Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/thirdpart/DTENLog/lib/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/thirdpart/ChannelMgr/mac/lib/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQuick.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtWidgets.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtSql.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtMultimedia.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQmlMeta.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQmlWorkerScript.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQmlModels.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtQml.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtOpenGL.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtNetwork.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtGui.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/Qt/6.8.1/macos/lib/QtCore.framework/Versions/A/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/Frameworks/QtQuick.framework/Versions/A/QtQuick' (no such file), '/Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/Frameworks/QtQuick.framework/Versions/A/QtQuick' (no such file) 14:24:19: The command "/Users/dten/Qt/Qt Creator.app/Contents/Resources/libexec/disclaim /Users/dten/code/DTENAPP/build/Qt_6_8_1_for_macOS-Release/DTENApp.app/Contents/MacOS/DTENApp" terminated abnormally.
09-29
CMake Error at E:/vs2022/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:67 (message): The C compiler "E:/vs2022/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64/cl.exe" is not able to compile a simple test program. It fails with the following output: Change Dir: 'E:/visualstudio‘sproject/workflow-master/workflow-master/out/build/x64-Debug/CMakeFiles/CMakeScratch/TryCompile-ohfyd7' Run Build Command(s): E:\VS2022\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe -v cmTC_19bd4 [1/2] E:\vs2022\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\cl.exe /nologo /DWIN32 /D_WINDOWS /W3 /MDd /Zi /Ob0 /Od /RTC1 /showIncludes /FoCMakeFiles\cmTC_19bd4.dir\testCCompiler.c.obj /FdCMakeFiles\cmTC_19bd4.dir\ /FS -c E:\visualstudio‘sproject\workflow-master\workflow-master\out\build\x64-Debug\CMakeFiles\CMakeScratch\TryCompile-ohfyd7\testCCompiler.c [2/2] C:\WINDOWS\system32\cmd.exe /C "cd . && E:\vs2022\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe -E vs_link_exe --msvc-ver=1944 --intdir=CMakeFiles\cmTC_19bd4.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- E:\vs2022\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_19bd4.dir\testCCompiler.c.obj /out:cmTC_19bd4.exe /implib:cmTC_19bd4.lib /pdb:cmTC_19bd4.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ." FAILED: cmTC_19bd4.exe C:\WINDOWS\system32\cmd.exe /C "cd . && E:\vs2022\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe -E vs_link_exe --msvc-ver=1944 --intdir=CMakeFiles\cmTC_19bd4.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- E:\vs2022\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmTC_19bd4.dir\testCCompiler.c.obj /out:cmTC_19bd4.exe /implib:cmTC_19bd4.lib /pdb:cmTC_19bd4.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ." RC Pass 1: command "rc /fo CMakeFiles\cmTC_19bd4.dir/manifest.res CMakeFiles\cmTC_19bd4.dir/manifest.rc" failed (exit code 0) with the following output: no such file or directory ninja: build stopped: subcommand failed. CMake will not be able to correctly generate this project.
最新发布
11-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值