使用CMake+Conan构建MSVC FreeGLUT项目出现LNK1104链接错误如何解决?
问题原因
- freeglut头文件默认开启自动链接逻辑,会根据编译模式自动要求链接
freeglut.lib(Release)或freeglutd.lib(Debug),但Conan官方源提供的freeglut包编译输出的库名为glut.lib,无版本后缀,两者名称不匹配导致链接错误。 - 根目录CMakeLists.txt执行顺序错误,先执行
add_subdirectory(src)创建了编译目标,再执行find_package和链接逻辑,部分配置无法正确应用到目标上。 - 执行
conan install时默认仅安装了Release版本的依赖,直接编译Debug模式时没有对应架构的依赖包。
解决步骤
- 禁用freeglut自动链接逻辑
在项目全局添加宏定义FREEGLUT_LIB_PRAGMAS=0,可以直接加在代码里#include <GL/glut.h>之前:
#define FREEGLUT_LIB_PRAGMAS 0 #include <GL/glut.h>
也可以在根目录CMakeLists.txt中全局添加:
add_compile_definitions(FREEGLUT_LIB_PRAGMAS=0)
- 修正CMakeLists.txt执行顺序
调整根目录CMakeLists.txt的内容,将add_subdirectory(src)移到依赖查找逻辑之后,保证编译目标创建时所有依赖配置已生效:
cmake_minimum_required(VERSION 3.20) project(OpenGLConan) # 先配置编译标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 导入Conan配置、查找依赖 include(${CMAKE_BINARY_DIR}/conan_paths.cmake) find_package(FreeGLUT REQUIRED) # 再创建编译目标 add_subdirectory(src) # 最后配置目标的头文件和链接库 target_include_directories(${PROJECT_NAME} PUBLIC ${FreeGLUT_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} ${FreeGLUT_LIBRARIES})
- 匹配编译模式安装对应依赖
编译Debug版本前,需要先安装Debug模式的Conan依赖:
# 清空build目录旧文件 cd build rm -rf * # 安装Debug版本依赖 conan install .. -s build_type=Debug # 生成VS工程 cmake .. -G "Visual Studio 16 2019" -A x64 # 编译Debug版本 cmake --build . --config Debug
如果需要同时支持VS的多配置切换,可以将conanfile.txt的生成器替换为cmake_find_package_multi:
[requires] freeglut/3.2.1 [generators] cmake_find_package_multi cmake_paths
之后分别执行conan install .. -s build_type=Release和conan install .. -s build_type=Debug安装两种模式的依赖,就可以直接在VS中切换配置编译,不需要重新生成工程。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

