CMake构建报错LNK1181:无法打开输入文件glew.lib求助
解决LNK1181: 无法打开输入文件'glew.lib'的问题
从你的CMake配置和报错信息来看,问题主要出在GLEW库的链接配置上,我帮你梳理几个核心修复点:
1. 修正库名称与链接变量的匹配问题
你用find_library查找的是静态库glew32s.lib,但在target_link_libraries里写的是glew,链接器会默认去找glew.lib,自然找不到目标文件。需要把查找结果存到明确的变量中,再用这个变量去链接:
修改这部分代码:
# 原代码 find_library(glew glew32s "${glew_DIR}/lib/Release/Win32") # 修改为 find_library(GLEW_LIB NAMES glew32s PATHS "${glew_DIR}/lib/Release/Win32" REQUIRED)
然后在链接时使用这个变量:
target_link_libraries( engine glfw ${GLEW_LIB} )
加REQUIRED参数的好处是,CMake如果找不到库会直接报错,能帮你快速排查路径是否正确。
2. 添加静态GLEW的预处理器定义
因为你用的是静态版本的GLEW(glew32s),必须在编译时定义GLEW_STATIC,否则编译器会默认尝试链接动态库的导入库。给engine目标添加这个定义:
target_compile_definitions(engine PUBLIC GLEW_STATIC)
3. 确保平台架构匹配
你硬编码了Win32的库路径,但如果在Visual Studio中生成的是x64解决方案,32位的库肯定无法被链接。可以优化路径配置,让CMake根据当前生成的架构自动选择:
# 替换原来的find_library路径部分 if(CMAKE_SIZEOF_VOID_P EQUAL 8) # 64位平台 set(GLEW_LIB_PATH "${glew_DIR}/lib/Release/x64") else() # 32位平台 set(GLEW_LIB_PATH "${glew_DIR}/lib/Release/Win32") endif() find_library(GLEW_LIB NAMES glew32s PATHS ${GLEW_LIB_PATH} REQUIRED)
这样不管你生成32位还是64位项目,CMake都会自动匹配对应的库路径。
4. 可选:改用CMake配置文件导入GLEW(更可靠)
如果你的GLEW包自带CMake配置文件(比如glew-config.cmake),可以改用find_package来导入,它会自动处理库路径、包含目录和预处理器定义,减少手动配置的错误:
set(glew_DIR ${CMAKE_SOURCE_DIR}/Dependencies/GLEW/lib/cmake/glew) # 替换成你的配置文件实际路径 find_package(glew REQUIRED) target_link_libraries(engine glfw GLEW::GLEW)
整合修改后的核心代码片段
把以上修复点整合后,GLEW相关的配置代码应该是这样的:
set(glew_DIR ${CMAKE_SOURCE_DIR}/Dependencies/GLEW) # 根据架构选择库路径 if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(GLEW_LIB_PATH "${glew_DIR}/lib/Release/x64") else() set(GLEW_LIB_PATH "${glew_DIR}/lib/Release/Win32") endif() find_library(GLEW_LIB NAMES glew32s PATHS ${GLEW_LIB_PATH} REQUIRED) include_directories(${glew_DIR}/include) target_compile_definitions(engine PUBLIC GLEW_STATIC) target_link_libraries( engine glfw ${GLEW_LIB} )
额外检查项
- 确认你的
Dependencies/GLEW/lib/Release/Win32(或x64)目录下确实存在glew32s.lib文件,如果没有,可能是GLEW包下载不完整,或者需要手动编译GLEW生成静态库。 - 可以在Visual Studio中右键项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项,查看是否正确添加了
glew32s.lib(而非glew.lib)。
内容的提问来源于stack exchange,提问作者Fabmaur




