dyld: Library not loaded: @rpath/QtWidgets.framework/Versions/5/QtWidgets

dyld: Library not loaded: @rpath/QtWidgets.framework/Versions/5/QtWidgets
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
在 macOS 系统中,当程序尝试加载动态库(dylib)时,如果 `dyld`(动态链接器)无法找到所需的库文件,会抛出类似 `dyld: Library not loaded: @rpath/libcurl.4.dylib` 的错误。这种问题通常与库路径配置、运行时链接器搜索路径或库本身的安装状态有关。 ### 1. 检查 libcurl.4.dylib 是否存在 首先确认系统中是否安装了 `libcurl.4.dylib`,可以通过以下命令查找: ```bash find /usr/local/lib /opt/local/lib -name "libcurl.4.dylib" ``` 如果没有找到,可能需要手动安装 libcurl 库,例如使用 Homebrew: ```bash brew install curl ``` ### 2. 配置 @rpath 路径 在 macOS 的动态链接机制中,`@rpath` 是一个运行时搜索路径(runtime search path),通常由链接器在构建时指定。如果程序依赖的库位于非标准路径中,可以通过 `install_name_tool` 修改库的路径。 例如,将可执行文件 `obs` 对 `libcurl.4.dylib` 的引用修改为绝对路径: ```bash install_name_tool -change @rpath/libcurl.4.dylib /usr/local/opt/curl/lib/libcurl.4.dylib ./obs ``` ### 3. 设置 DYLD_LIBRARY_PATH 在运行程序前,可以通过设置 `DYLD_LIBRARY_PATH` 环境变量来临时添加动态库搜索路径: ```bash export DYLD_LIBRARY_PATH=/usr/local/opt/curl/lib:$DYLD_LIBRARY_PATH ./obs ``` 此方法适用于调试,但不建议长期使用,因为它可能带来安全风险。 ### 4. 使用 otool 检查依赖库路径 使用 `otool -L` 可以查看可执行文件所依赖的动态库路径: ```bash otool -L ./obs ``` 输出示例如下: ``` @rpath/libcurl.4.dylib (compatibility version 7.0.0, current version 7.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1) ``` 如果发现路径不正确,可以使用 `install_name_tool` 进行修正。 ### 5. 使用 Homebrew 安装依赖库 如果使用 Homebrew 管理库,可以尝试通过以下命令安装 libcurl 并确保其版本兼容: ```bash brew install curl brew link --force curl ``` ### 6. 重新构建项目并指定库路径 在构建项目时,可以通过 CMake 或 Xcode 设置正确的库搜索路径。例如,在 CMake 中可以指定: ```bash cmake -DCMAKE_PREFIX_PATH=/usr/local/opt/curl .. ``` 或在构建命令中添加链接器标志: ```bash -DCURL_LIBRARY=/usr/local/opt/curl/lib/libcurl.dylib ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值