MSVC2019编译遇LNK1104无法打开glew32s.lib及后续警告问题
问题:MSVC2019编译CMake项目时的链接警告及前期LNK1104错误
此前编译项目时出现LINK致命错误LNK1104:无法打开文件'glew32s.lib',尝试find_package未解决,添加target_link_directories后错误消除,但出现两个链接警告:
- LNK4099:找不到
glew_static.pdb - 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")
- 方法一:按编译配置区分链接的GLEW库,Debug模式用
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编译选项。
- 统一项目与GLEW的运行时库,在CMake中设置项目使用多线程静态运行时:
优化后的完整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
相关产品推荐
相关产品推荐

