【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
<think>我们正在处理用户关于CMake构建类型的问题。用户希望知道如何传递参数以指定构建类型为Release。 根据引用[1],我们看到一个示例中同时指定了debug和release的安装配置。但用户只需要指定构建类型为Release。 实际上,在配置CMake时,可以通过命令行参数设置CMAKE_BUILD_TYPE变量。 步骤: 1. 在生成构建系统时,通过命令行传递参数:`cmake -DCMAKE_BUILD_TYPE=Release ...` 2. 如果已经配置过但需要改变构建类型,可能需要重新配置(删除CMakeCache.txt或整个build目录)或者使用cmake-gui等工具修改。 注意:引用[3]提到了cmake_minimum_required,但这不是直接相关的,不过它提醒我们确保CMake版本兼容性。 因此,我们可以这样指导用户: 要指定构建类型为Release,可以在运行cmake命令时使用以下参数: cmake -DCMAKE_BUILD_TYPE=Release /path/to/source 如果使用多配置生成器(如Visual Studio),则构建类型是在构建时选择的,而不是在配置时。此时,可以在构建时使用: cmake --build . --config Release 但用户明确提到“传递CMake参数以指定构建类型为Release”,所以我们主要针对单配置生成器(如Unix Makefiles)的情况。 根据引用[2]和[4]的内容,它们与当前问题关系不大,但引用[2]提到设置项目名称和版本要求,引用[4]是关于catkin(ROS)中添加服务文件,这些可以忽略。 现在,按照系统指令生成相关问题: 1. 如何为CMake指定不同的构建类型(如Debug、Release)? 2. 在CMake中,如何为不同的构建类型设置不同的编译选项? 3. 使用多配置生成器(如Visual Studio)时,如何指定构建类型? 注意:用户的问题已经明确,所以我们直接回答。</think>### 指定 CMake 构建类型为 Release 在 CMake 中指定构建类型为 Release 的步骤如下: 1. **命令行配置(推荐方式)** 在运行 `cmake` 命令时,通过 `-D` 参数直接设置 `CMAKE_BUILD_TYPE` 变量: ```bash cmake -DCMAKE_BUILD_TYPE=Release /path/to/source ``` 此方法会在生成构建系统时强制使用 Release 配置[^1]。 2. **CMakeLists.txt 预设(不推荐)** 可在项目根目录的 `CMakeLists.txt` 中预设默认值(但会被命令行覆盖): ```cmake # 在 project() 命令后设置 set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type") ``` 3. **构建阶段指定(多配置生成器)** 对于 Visual Studio/Xcode 等多配置生成器,构建时需显式指定: ```bash cmake --build . --config Release ``` ### 关键说明 - **单配置 vs 多配置生成器** `CMAKE_BUILD_TYPE` 仅对单配置生成器(如 Make/Ninja)生效。多配置生成器(如 Visual Studio)忽略此变量[^3]。 - **编译选项影响** Release 模式通常启用优化(如 GCC 的 `-O3`)并禁用调试信息[^1]。 - **缓存机制** 首次配置后,变量值会存入 `CMakeCache.txt`。修改需清除缓存或重新指定 `-D` 参数。 ### 验证方法 检查生成的构建系统文件或编译输出: ```bash cat CMakeCache.txt | grep CMAKE_BUILD_TYPE # 或编译时观察优化标志 make VERBOSE=1 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值