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

CMake构建SFML项目字体加载失败,如何使用相对路径?

问题根源

CLion运行程序时,默认将工作目录设为项目根目录,因此代码里的"font.ttf"能找到项目根目录下的字体文件。但直接运行构建生成的可执行文件时,工作目录是可执行文件所在的文件夹(比如build/Debug或build/Release),该文件夹内没有font.ttf,所以加载失败。

解决方法

推荐通过CMake自动同步资源文件,确保每次构建时字体都被复制到正确位置,实现相对路径加载。

方法一:复制字体到可执行文件所在目录(调试用)

修改你的CMakeLists.txt,在末尾添加以下代码:

# 自动复制字体文件到可执行文件所在目录
file(COPY ${CMAKE_SOURCE_DIR}/font.ttf DESTINATION $<TARGET_FILE_DIR:space_shooter_game>)
  • ${CMAKE_SOURCE_DIR}指向项目根目录,确保font.ttf确实存放在这里
  • $<TARGET_FILE_DIR:space_shooter_game>会自动定位到可执行文件最终生成的目录(兼容Debug/Release模式)

重新构建项目后,字体文件会被同步到可执行文件旁,此时直接运行可执行文件就能通过"font.ttf"相对路径加载字体。

方法二:生成macOS App Bundle(发布用)

如果要打包成标准的macOS .app格式,先修改add_executable行,添加MACOSX_BUNDLE标识:

add_executable(space_shooter_game MACOSX_BUNDLE ${SOURCE_FILES})

再添加复制字体到Bundle资源目录的指令:

# 复制字体到App Bundle的Resources目录
file(COPY ${CMAKE_SOURCE_DIR}/font.ttf DESTINATION $<TARGET_BUNDLE_CONTENT_DIR:space_shooter_game>/Resources)

同时修改字体加载代码的路径,适配Bundle内部结构:

if (!font.loadFromFile("Resources/font.ttf")) { 
    std::cerr << "Cannot load font" << std::endl;
    return 0;
}

构建完成后生成的.app可直接双击运行,字体能正常加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:50:01