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

使用CMake+Conan构建MSVC FreeGLUT项目出现LNK1104链接错误如何解决?

问题原因

  1. freeglut头文件默认开启自动链接逻辑,会根据编译模式自动要求链接freeglut.lib(Release)或freeglutd.lib(Debug),但Conan官方源提供的freeglut包编译输出的库名为glut.lib,无版本后缀,两者名称不匹配导致链接错误。
  2. 根目录CMakeLists.txt执行顺序错误,先执行add_subdirectory(src)创建了编译目标,再执行find_package和链接逻辑,部分配置无法正确应用到目标上。
  3. 执行conan install时默认仅安装了Release版本的依赖,直接编译Debug模式时没有对应架构的依赖包。

解决步骤

  1. 禁用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)
  1. 修正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})
  1. 匹配编译模式安装对应依赖
    编译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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:54:02