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

