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

Mac M1下CMake编译Qt5静态链接时出现重复符号问题

Mac M1上CMake编译Qt5项目的重复符号错误

我在Mac M1上用CMake编译一个基于C++的Qt5项目,该项目在Fedora系统上可正常编译,但在M1平台遇到问题:同时链接Qt5::Core和Qt5::Network时,链接阶段会抛出大量重复符号错误;仅链接其中任意一个模块时,编译可正常完成。

CMake配置文件

cmake_minimum_required(VERSION 3.0)
project(rtype)

set(CMAKE_AUTOMOC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

set(CPACK_OUTPUT_FILE_PREFIX "pack")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/bin)

add_executable(${PROJECT_NAME} src/ecs/main.cpp)

# Adding QT5 dependencies
find_package(Qt5 COMPONENTS Core Network REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network)

# Adding SFML dependencies
find_package(SFML COMPONENTS system window graphics CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE sfml-system sfml-window sfml-graphics)

# Ajouter les includes pour SFML
target_include_directories(${PROJECT_NAME} 
    PRIVATE
    ${SFML_INCLUDE_DIRS})

# Setting up the CPack generator
set(CPACK_GENERATOR ZIP) # for macOS and Linux
set(CPACK_BUNDLE_NAME ${PROJECT_NAME})
set(CPACK_BUNDLE_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
set(CPACK_BUNDLE_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.icns)
set(CPACK_GENERATOR NSIS) # for Windows
set(CPACK_PACKAGE_NAME "RType")
set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
include(CPack)

# Setting up the install targets
install(TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin)
install(FILES README.md
        DESTINATION .)
install(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/build.sh
        DESTINATION .)

错误信息

[ 20%] Automatic MOC for target rtype
[ 20%] Built target rtype_autogen
[ 40%] Linking CXX executable /Users/ilaan/Documents/Epitech/Tek3/R-Type/client/bin/rtype
duplicate symbol 'qt_apple_sharedApplication()' in:
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib/libQt5Core.a(qcore_mac.o)
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib//libQt5Core.a(qcore_mac.o)
duplicate symbol 'qt_apple_check_os_version()' in:
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib/libQt5Core.a(qcore_mac.o)
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib//libQt5Core.a(qcore_mac.o)
duplicate symbol 'qt_apple_isApplicationExtension()' in:
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib/libQt5Core.a(qcore_mac.o)
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib//libQt5Core.a(qcore_mac.o)
[...]
duplicate symbol 'RunLoopDebugger::staticMetaObject' in:
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib/libQt5Core.a(qeventdispatcher_cf.o)
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib//libQt5Core.a(qeventdispatcher_cf.o)
duplicate symbol 'QEventDispatcherCoreFoundation::staticMetaObject' in:
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib/libQt5Core.a(qeventdispatcher_cf.o)
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib//libQt5Core.a(qeventdispatcher_cf.o)
duplicate symbol 'QEventDispatcherCoreFoundation::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)' in:
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib/libQt5Core.a(qeventdispatcher_cf.o)
    /Users/ilaan/Documents/Epitech/Tek3/R-Type/vcpkg/installed/arm64-osx/lib//libQt5Core.a(qeventdispatcher_cf.o)
ld: 94 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [/Users/ilaan/Documents/Epitech/Tek3/R-Type/client/bin/rtype] Error 1
make[1]: *** [CMakeFiles/rtype.dir/all] Error 2
make: *** [all] Error 2

可能的原因与解决方法

1. 静态库依赖重复引入

从错误路径可见,你使用vcpkg安装的是Qt5静态库(.a文件),而Qt5::Network本身会依赖Qt5::Core,同时显式链接两者会导致Qt5::Core被重复加入链接列表。

解决方法:

  • 仅链接Qt5::Network即可,它会自动拉取依赖的Qt5::Core:
    find_package(Qt5 COMPONENTS Network REQUIRED)
    target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Network)
    
  • 改用Qt动态库版本:在vcpkg安装Qt5时添加--feature-flags=dynamic参数,重新安装后再编译项目。

2. CMake路径配置错误

错误信息中出现lib//libQt5Core.a这种重复斜杠的路径,说明vcpkg生成的CMake配置存在路径拼接错误,导致库被重复添加。

解决方法:

  • 清理项目缓存后重新构建:
    rm -rf build
    mkdir build && cd build
    cmake ..
    make
    
  • 检查vcpkg的Qt5安装状态,确保仅存在arm64架构的库,无x86_64版本干扰:
    vcpkg list | grep qt5
    

3. M1架构静态库兼容性问题

Qt5静态库在M1芯片上可能存在编译架构适配问题,导致符号重复。

解决方法:

  • 使用官方Qt安装包替代vcpkg版本,官方提供的M1适配版本稳定性更好。
  • 编译时明确指定arm64架构:
    cmake .. -DCMAKE_OSX_ARCHITECTURES=arm64
    

内容的提问来源于stack exchange,提问作者Pouney Design

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:05:33