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

为何使用绝对路径调用target_link_libraries链接dll文件失败?

在Windows平台下,直接用target_link_libraries链接DLL文件是错误的,核心原因和解决方法如下:

核心原因

Windows的动态链接机制中,链接阶段需要的是导入库(.lib文件),而非DLL本身:

  • DLL是程序运行时才会加载的二进制文件,不包含链接所需的符号信息;
  • 导入库(.lib)才是用来告诉编译器/链接器DLL中导出函数的地址信息,是链接阶段的依赖文件。
    你直接传入glfw3.dll的路径,CMake无法从中解析出链接需要的符号,自然会链接失败。

解决步骤

  1. 确认导入库存在
    检查你的lib目录下,GLFW应该提供对应的导入库:

    • 如果是动态链接GLFW,对应导入库通常是glfw3dll.lib;
    • 如果是静态链接GLFW,对应库文件是glfw3.lib。
  2. 修改CMake代码链接导入库
    替换target_link_libraries中的DLL路径为对应的.lib文件:

    • 如果你已经用LINK_DIRECTORIES指定了lib目录,直接写库名即可:
      add_executable(HelloOpenGL main.cpp src/glad.c)
      # 动态链接用glfw3dll,静态链接用glfw3
      target_link_libraries(HelloOpenGL glfw3dll)
      
      foreach(A_CPP_FILE ${SOURCE_FILES})
          get_filename_component(EXECUTABLE_NAME ${A_CPP_FILE} NAME_WE)
          add_executable(${EXECUTABLE_NAME} ${A_CPP_FILE})
          target_link_libraries(${EXECUTABLE_NAME} glfw3dll)
      endforeach()
      
    • 也可以直接指定.lib的绝对路径:
      target_link_libraries(HelloOpenGL ${PROJECT_SOURCE_DIR}/lib/glfw3dll.lib)
      
  3. 确保运行时能找到DLL
    链接成功后,需要将glfw3.dll放到可执行文件的同级目录,或者添加到系统PATH环境变量中,否则程序运行时会提示找不到DLL。

额外优化建议

  • 避免用file(GLOB)收集源文件:CMake官方不推荐这种方式,当你增删文件时,CMake不会自动感知,需要手动重新运行CMake,建议显式列出所有源文件;
  • 优先用find_package管理依赖:如果GLFW是通过包管理器安装的,或者你配置了CMake的搜索路径,用find_package(glfw3 REQUIRED)可以自动处理库的路径和依赖,代码更健壮:
    find_package(glfw3 REQUIRED)
    target_link_libraries(HelloOpenGL glfw)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:42:38