Windows 32位环境下Freetype2链接失败问题求助
Windows 32位环境下Freetype2配置失败问题
问题描述
在Windows 32位环境中尝试配置Freetype2一周仍未成功,CMake输出关键错误如下:
[cmake] -- Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) [cmake] -- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR) [cmake] -- Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) [cmake] -- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR) [cmake] -- Could NOT find BZip2 (missing: BZIP2_LIBRARIES BZIP2_INCLUDE_DIR) [cmake] -- Could NOT find BrotliDec (missing: BROTLIDEC_INCLUDE_DIRS BROTLIDEC_LIBRARIES)
当前使用的CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.0.0) set(CMAKE_CXX_STANDARD 17) project(template-project) # change the name here file(GLOB_RECURSE SOURCE_FILES src/*.cpp) add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES}) list(APPEND CMAKE_PREFIX_PATH "D:/Installs/ProgFiles/glew") find_package( OpenGL REQUIRED ) include_directories( ${OPENGL_INCLUDE_DIRS} ) # this is so stupid set(CMAKE_SIZEOF_VOID_P 4) if (${CMAKE_CXX_COMPILER_ID} STREQUAL Clang) # ensure 32 bit on clang set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -target i386-pc-windows-msvc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -target i386-pc-windows-msvc") add_definitions("--target=i386-pc-windows-msvc") endif() set(FT_DISABLE_HARFBUZZ TRUE) target_include_directories(${PROJECT_NAME} PRIVATE libraries/minhook/include libraries/gd.h/include libraries/gd.h/ libraries/imgui libraries/glad/include libraries/stb libraries/freetype2/include ) add_subdirectory(libraries/minhook) add_subdirectory(libraries/cocos-headers) add_subdirectory(libraries/glfw) add_subdirectory(libraries/glm) add_subdirectory(libraries/freetype2) target_link_libraries( ${PROJECT_NAME} ${OPENGL_LIBRARIES} glfw ) if( MSVC ) if(${CMAKE_VERSION} VERSION_LESS "3.6.0") message( "\n\t[ WARNING ]\n\n\tCMake version lower than 3.6.\n\n\t - Please update CMake and rerun; OR\n\t - Manually set 'GLFW-CMake-starter' as StartUp Project in Visual Studio.\n" ) else() set_property( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT GLFW-CMake-starter ) endif() endif() target_link_libraries(${PROJECT_NAME} opengl32.lib minhook cocos2d rpcrt4.lib glm ${PROJECT_SOURCE_DIR}/libraries/freetype2/objs/Win32/Release/freetype.lib)
尝试过通过mingw32安装ZLIB,也尝试过像配置minhook和glad那样链接,但均无效。
解决方案
1. 禁用Freetype的可选依赖
Freetype默认会启用对ZLIB、PNG、BZip2等库的支持,这些是可选依赖,若不需要相关功能,可直接禁用:
在add_subdirectory(libraries/freetype2)之前添加以下配置:
# 禁用所有可选依赖,仅保留核心功能 set(FT_DISABLE_ZLIB TRUE) set(FT_DISABLE_PNG TRUE) set(FT_DISABLE_BZIP2 TRUE) set(FT_DISABLE_BROTLIDEC TRUE)
结合已设置的FT_DISABLE_HARFBUZZ TRUE,Freetype就不会再寻找这些库。
2. 手动指定依赖库路径(若需保留依赖功能)
如果确实需要这些依赖的功能,需下载对应32位版本的库,并在CMake中指定路径:
- 下载ZLIB、PNG、BZip2、Brotli的32位预编译库(注意匹配你的编译器:MSVC或MinGW)
- 在CMakeLists.txt中添加路径配置,以ZLIB为例:
set(ZLIB_INCLUDE_DIR "D:/path/to/zlib/include") set(ZLIB_LIBRARY "D:/path/to/zlib/lib/zlib.lib") # 32位库文件 find_package(ZLIB REQUIRED)
其他库同理,替换对应的路径和库文件名。
3. 规范CMake 32位环境配置
手动设置CMAKE_SIZEOF_VOID_P 4的方式不够规范,建议通过CMake参数指定32位构建:
- 使用CMake GUI时,配置阶段选择
CMAKE_GENERATOR_PLATFORM为Win32 - 使用命令行时,添加参数:
cmake -G "Visual Studio 17 2022" -A Win32 ..(根据你的VS版本调整)
避免手动设置指针宽度带来的潜在问题。
4. 移除硬编码的Freetype库链接
当前在target_link_libraries中硬编码的${PROJECT_SOURCE_DIR}/libraries/freetype2/objs/Win32/Release/freetype.lib会和add_subdirectory(libraries/freetype2)生成的库冲突,应移除该行,改用Freetype提供的目标:
target_link_libraries(${PROJECT_NAME} opengl32.lib minhook cocos2d rpcrt4.lib glm freetype)
内容的提问来源于stack exchange,提问作者DePianoman
相关产品推荐
相关产品推荐

