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
相关产品推荐
相关产品推荐

