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

MSVC2019编译遇LNK1104无法打开glew32s.lib及后续警告问题

问题:MSVC2019编译CMake项目时的链接警告及前期LNK1104错误

此前编译项目时出现LINK致命错误LNK1104:无法打开文件'glew32s.lib',尝试find_package未解决,添加target_link_directories后错误消除,但出现两个链接警告:

  1. LNK4099:找不到glew_static.pdb
  2. LNK4098:LIBCMT库冲突

原CMake配置代码

cmake_minimum_required(VERSION 3.14)

project(vertex)

add_executable(vortex expositive.cpp)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

add_subdirectory(plugins/glfw)

set( GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE )
set( GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE )
set( GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE )

set(glew_DIR C:/Users/Users/AppData/Local/nvim/plugins/plugins/glew/lib/Release/x64)

target_include_directories(vortex PUBLIC plugins/glfw/include)

target_include_directories(vortex PUBLIC ${PROJECT_SOURCE_DIR}/glew/include)

#target_compile_definitions(vortex PRIVATE GLEW_STATIC)

target_link_directories(vortex PUBLIC plugins/glfw/src PUBLIC plugins/glew/bin/Release/x64)

find_library(GLEW_LIBRARY NAMES glew32s PATH_SUFFIXES glew_DIR)

find_package(glm REQUIRED)

target_link_libraries(vortex glew32s glfw glm::glm)

find_package(OpenGL REQUIRED)

if (OPENGL_FOUND)
    message("opengl found")
    message("include dir: ${OPENGL_INCLUDE_DIR}")
    message("link libraries: ${OPENGL_gl_LIBRARY}")
else (OPENGL_FOUND)
    message("opengl not found")
endif()

target_link_libraries(vortex ${OPENGL_gl_LIBRARY})

警告信息

(Link target) -
  glew32s.lib(glew.obj) : warning LNK4099: PDB 'glew_static.pdb' was not found with 'glew32s.lib(glew.obj)' or at 'C:\Users\Users\AppData\Local\nvim\plugins\plugins\Debug\glew_static.pdb'; linking object as if no debug info [C:\Users\Users\AppData\Local\nvim\plugins\plugins\vortex.vcxproj]
  LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library [C:\Users\Users\AppData\Local\nvim\plugins\plugins\vortex.vcxproj]

    2 Warning(s)

解决方案

1. 处理LNK4099(找不到glew_static.pdb)

  • 原因:链接的是Release版本的glew32s.lib,但当前CMake处于Debug模式,编译器会自动去Debug输出目录搜索PDB文件,而Release版的PDB不在该路径。
  • 解决方法:
    • 方法一:按编译配置区分链接的GLEW库,Debug模式用glew32sd.lib,Release模式用glew32s.lib,通过CMake的$<CONFIG>变量实现:
      target_link_libraries(vortex $<$<CONFIG:Debug>:glew32sd> $<$<CONFIG:Release>:glew32s> glfw glm::glm ${OPENGL_gl_LIBRARY})
      
    • 方法二:如果只有Release版GLEW库,可将Release目录下的glew_static.pdb复制到CMake生成的Debug输出目录(即警告中提示的C:\Users\Users\AppData\Local\nvim\plugins\plugins\Debug\),或通过CMake指定PDB搜索路径:
      set_target_properties(vortex PROPERTIES LINK_FLAGS_DEBUG "/PDBPATH:C:/Users/Users/AppData/Local/nvim/plugins/plugins/glew/lib/Release/x64")
      

2. 处理LNK4098(LIBCMT库冲突)

  • 原因:GLEW静态库glew32s.lib是用多线程静态运行时(/MT)编译的,而你的项目默认可能使用多线程DLL运行时(/MD),导致运行时库类型冲突。
  • 解决方法:
    • 统一项目与GLEW的运行时库,在CMake中设置项目使用多线程静态运行时:
      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
      set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
      
    • 若需保留/MD运行时,需重新编译GLEW并指定/MD编译选项。

优化后的完整CMake代码

cmake_minimum_required(VERSION 3.14)

project(vertex)

# 统一运行时库为多线程静态,解决LIBCMT冲突
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")

add_executable(vortex expositive.cpp)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

# 先设置GLFW编译选项再添加子目录,确保配置生效
set( GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE )
set( GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE )
set( GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE )
add_subdirectory(plugins/glfw)

# GLEW相关配置
set(GLEW_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/glew/include)
set(GLEW_LIB_DIR_DEBUG "C:/Users/Users/AppData/Local/nvim/plugins/plugins/glew/lib/Debug/x64") # 需确保存在Debug库目录
set(GLEW_LIB_DIR_RELEASE "C:/Users/Users/AppData/Local/nvim/plugins/plugins/glew/lib/Release/x64")

target_include_directories(vortex PUBLIC plugins/glfw/include ${GLEW_INCLUDE_DIR})

# 按编译配置添加对应库目录
target_link_directories(vortex PUBLIC 
    $<$<CONFIG:Debug>:${GLEW_LIB_DIR_DEBUG}>
    $<$<CONFIG:Release>:${GLEW_LIB_DIR_RELEASE}>
    plugins/glfw/src
)

# 启用GLEW静态编译定义,必须开启才能正确链接静态库
target_compile_definitions(vortex PRIVATE GLEW_STATIC)

find_package(glm REQUIRED)
find_package(OpenGL REQUIRED)

if (OPENGL_FOUND)
    message("opengl found")
    message("include dir: ${OPENGL_INCLUDE_DIR}")
    message("link libraries: ${OPENGL_gl_LIBRARY}")
else (OPENGL_FOUND)
    message("opengl not found")
endif()

# 按配置链接对应版本的GLEW库
target_link_libraries(vortex 
    $<$<CONFIG:Debug>:glew32sd> 
    $<$<CONFIG:Release>:glew32s> 
    glfw glm::glm ${OPENGL_gl_LIBRARY}
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:39:57