macOS下CMake查找sfml-system路径错误问题求助
macOS下CMake配置SFML出现sfml-system路径错误的解决方法
问题重现
执行CMake配置SFML项目时,即使CMakeLists.txt中未显式引用sfml-system模块,仍抛出如下路径错误:
CMake Error at /Library/Frameworks/SFML.framework/Versions/2.6.0/Resources/CMake/SFMLSharedTargets.cmake:144 (message): The imported target "sfml-system" references the file "/Library/Frameworks/SFML.framework/Versions/./sfml-system.framework/Versions/2.6.0/sfml-system" but this file does not exist. Possible reasons include: * The file was deleted, renamed, or moved to another location. * An install or uninstall procedure did not complete successfully. * The installation package was faulty and contained "/Library/Frameworks/SFML.framework/Versions/2.6.0/Resources/CMake/SFMLSharedTargets.cmake" but not all the files it references. Call Stack (most recent call first): /Library/Frameworks/SFML.framework/Versions/2.6.0/Resources/CMake/SFMLConfig.cmake:116 (include) CMakeLists.txt:7 (find_package)
已尝试清除CMake缓存、删除CMakeFiles目录、重新添加SFML框架、简化CMakeLists.txt至最简形式,问题仍未解决。
解决方案
1. 手动修复SFML的CMake目标配置文件
错误根源是SFML自带的SFMLSharedTargets.cmake文件中存在错误路径(包含多余的./),直接修改该文件即可:
- 打开路径:
/Library/Frameworks/SFML.framework/Versions/2.6.0/Resources/CMake/SFMLSharedTargets.cmake - 搜索所有包含
./sfml-system.framework的行,将路径中的./删除,修正为正确的框架路径。例如将错误路径:
修改为:/Library/Frameworks/SFML.framework/Versions/./sfml-system.framework/Versions/2.6.0/sfml-system/Library/Frameworks/sfml-system.framework/Versions/2.6.0/sfml-system - 保存文件后,重新执行CMake配置。
2. 重新安装SFML(推荐)
如果手动修改配置文件嫌麻烦,直接重新安装正确版本的SFML可以彻底解决路径问题:
- 完全卸载现有SFML:删除
/Library/Frameworks/SFML.framework以及所有sfml-*.framework文件(若存在) - 选择以下一种方式重新安装:
- Homebrew安装:终端执行
brew install sfml,Homebrew会自动处理CMake配置文件的路径问题,兼容性最好 - 官方安装包:下载对应macOS的2.6.0版本安装包,按照指引完成安装
- Homebrew安装:终端执行
3. 手动指定SFML的CMake配置路径
若不想修改或重装SFML,可以在CMake中手动指定正确的SFML配置目录,避免加载错误的路径:
- 在CMakeLists.txt开头添加:
set(SFML_DIR "/Library/Frameworks/SFML.framework/Versions/2.6.0/Resources/CMake") - 或者在执行CMake命令时通过参数指定:
cmake .. -DSFML_DIR=/Library/Frameworks/SFML.framework/Versions/2.6.0/Resources/CMake
补充说明
即使CMakeLists.txt中未显式引用sfml-system,find_package(SFML)指令默认会加载SFML的核心模块配置,因此仍会触发该路径错误。
内容的提问来源于stack exchange,提问作者mvoorhes
相关产品推荐
相关产品推荐

