MacOS下Qt6+CMake+Conan项目运行时动态链接失败求助
问题:CMake+Conan+Qt6项目运行时QtCore加载失败
问题现象
项目构建无失败,但运行时触发动态链接错误:
dyld[68458]: Library not loaded: '@rpath/QtCore.framework/Versions/A/QtCore'
Referenced from: '/Users/chell/code/skytracker/cmake-build-debug/bin/skytracker'
Reason: tried: '/Library/Frameworks/QtCore.framework/Versions/A/QtCore' (no such file), '/System/Library/Frameworks/QtCore.framework/Versions/A/QtCore' (no such file)
原本未引入Conan管理的libgphoto2时,QtCore可正常调用;添加libgphoto2后出现该问题,推测是Conan修改了默认RPATH配置,导致Qt库路径未被纳入搜索列表。
环境信息
- MacOS 12.6.3(后续将交叉编译到树莓派,已配置GitHub Action CI)
- Qt6 v6.4.2 安装在用户主目录
- Conan 1.58.0
- Cmake 3.25.1
项目CMake配置文件
cmake_minimum_required(VERSION 3.22) project(skytracker) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) #Conan integration if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") message(STATUS "Downloading conan.cmake from https://github.com/conan-io/cmake-conan") file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/0.18.1/conan.cmake" "${CMAKE_BINARY_DIR}/conan.cmake" TLS_VERIFY ON) endif() include(${CMAKE_BINARY_DIR}/conan.cmake) set(CI false CACHE BOOL "Set true if CI build") if(${CI}) message("Using CI profile") set(CMAKE_C_COMPILER /usr/bin/gcc) set(CMAKE_CXX_COMPILER /usr/bin/g++) set(CONANPROFILE ../CI.conanprofile) endif() conan_cmake_install(PATH_OR_REFERENCE .. BUILD missing REMOTE conancenter PROFILE ${CONANPROFILE}) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup(TARGETS) set(sources src/cpp/main.cpp src/cpp/services/PhotoService.cpp src/cpp/services/PhotoService.h # src/cpp/entities/Camera.h src/cpp/entities/Camera.cpp # src/cpp/entities/NikonCamera.cpp src/cpp/entities/NikonCamera.h ) set(CMAKE_AUTOMOC ON) #Qt C++ extensions set(CMAKE_AUTOUIC OFF) #Enable GUI compile set(CMAKE_AUTORCC OFF) #Enable QRC files if(APPLE) set(Qt6_DIR ~/Qt/6.4.2/macos/lib/cmake/Qt6/) set(CONANPROFILE macos.conanprofile) set(CMAKE_MACOSX_RPATH 1) elseif(UNIX) set(Qt6_DIR ~/Qt/6.4.2/gcc_64/lib/cmake/Qt6/) set(CONANPROFILE unix.conanprofile) elseif(WIN32) set(Qt6_DIR C:/Qt/6.4.2/mingw_64/lib/cmake/Qt6/) set(CONANPROFILE windows.conanprofile) endif() #find the Qt libs used by the project find_package(Qt6 6.4.2 REQUIRED COMPONENTS Core) include(${CMAKE_BINARY_DIR}/conan_paths.cmake) # give the compiler the path to the libs link_directories("${CONAN_LIB_DIRS}") # and to the headers include_directories("${CONAN_INCLUDE_DIRS}") add_executable(skytracker ${sources}) #link all Qt libs to the executable target_link_libraries(skytracker PRIVATE Qt6::Core) target_link_libraries(skytracker PRIVATE ${CONAN_LIBS})
otool -L 输出结果
skytracker: @rpath/QtCore.framework/Versions/A/QtCore (compatibility version 6.0.0, current version 6.4.2) /Users/chell/.conan/data/libgphoto2/2.5.27/_/_/package/8880a3412c5909fb46130c128d3ff83f4602ce9e/lib/libgphoto2.6.dylib (compatibility version 8.0.0, current version 8.0.0) /Users/chell/.conan/data/libgphoto2/2.5.27/_/_/package/8880a3412c5909fb46130c128d3ff83f4602ce9e/lib/libgphoto2_port.12.dylib (compatibility version 13.0.0, current version 13.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1953.255.0) /System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 60420.60.24) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.36.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1319.0.0)
解决方案
核心原因
conan_basic_setup(TARGETS) 会修改CMake的RPATH默认配置规则,覆盖Qt6原本自动添加的库路径,导致运行时链接器无法找到QtCore。
修复步骤
- 调整加载顺序:将
find_package(Qt6)移到conan_basic_setup之前,让Qt的RPATH配置优先生效,避免被Conan覆盖。 - 手动指定RPATH:如果顺序调整后问题仍存在,直接为可执行文件添加Qt库路径:
if(APPLE) set_target_properties(skytracker PROPERTIES BUILD_RPATH "~/Qt/6.4.2/macos/lib" INSTALL_RPATH "~/Qt/6.4.2/macos/lib" BUILD_WITH_INSTALL_RPATH ON ) endif() - 禁止Conan修改RPATH:在
conan_basic_setup中添加SKIP_RPATH参数,完全由自己管理RPATH(需同时确保Conan依赖的libgphoto2路径被正确添加):conan_basic_setup(TARGETS SKIP_RPATH) - 验证RPATH:执行
otool -l skytracker | grep -A 5 LC_RPATH,检查输出中是否包含Qt库的路径,确认配置生效。
优化后的CMake片段示例
# 先加载Qt配置 if(APPLE) set(Qt6_DIR ~/Qt/6.4.2/macos/lib/cmake/Qt6/) set(CONANPROFILE macos.conanprofile) set(CMAKE_MACOSX_RPATH 1) elseif(UNIX) set(Qt6_DIR ~/Qt/6.4.2/gcc_64/lib/cmake/Qt6/) set(CONANPROFILE unix.conanprofile) elseif(WIN32) set(Qt6_DIR C:/Qt/6.4.2/mingw_64/lib/cmake/Qt6/) set(CONANPROFILE windows.conanprofile) endif() find_package(Qt6 6.4.2 REQUIRED COMPONENTS Core) # 再加载Conan配置 conan_cmake_install(PATH_OR_REFERENCE .. BUILD missing REMOTE conancenter PROFILE ${CONANPROFILE}) include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) conan_basic_setup(TARGETS) # ... 其他配置 ... add_executable(skytracker ${sources}) target_link_libraries(skytracker PRIVATE Qt6::Core ${CONAN_LIBS}) # 显式设置RPATH if(APPLE) set_target_properties(skytracker PROPERTIES BUILD_RPATH "~/Qt/6.4.2/macos/lib" INSTALL_RPATH "~/Qt/6.4.2/macos/lib" ) endif()
内容的提问来源于stack exchange,提问作者BenjaminD
相关产品推荐
相关产品推荐

