You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

修复步骤

  1. 调整加载顺序:将find_package(Qt6)移到conan_basic_setup之前,让Qt的RPATH配置优先生效,避免被Conan覆盖。
  2. 手动指定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()
    
  3. 禁止Conan修改RPATH:在conan_basic_setup中添加SKIP_RPATH参数,完全由自己管理RPATH(需同时确保Conan依赖的libgphoto2路径被正确添加):
    conan_basic_setup(TARGETS SKIP_RPATH)
    
  4. 验证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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:59:17