为何使用绝对路径调用target_link_libraries链接dll文件失败?
为什么用绝对路径通过target_link_libraries链接DLL失败?
在Windows平台下,直接用target_link_libraries链接DLL文件是错误的,核心原因和解决方法如下:
核心原因
Windows的动态链接机制中,链接阶段需要的是导入库(.lib文件),而非DLL本身:
- DLL是程序运行时才会加载的二进制文件,不包含链接所需的符号信息;
- 导入库(.lib)才是用来告诉编译器/链接器DLL中导出函数的地址信息,是链接阶段的依赖文件。
你直接传入glfw3.dll的路径,CMake无法从中解析出链接需要的符号,自然会链接失败。
解决步骤
确认导入库存在
检查你的lib目录下,GLFW应该提供对应的导入库:- 如果是动态链接GLFW,对应导入库通常是
glfw3dll.lib; - 如果是静态链接GLFW,对应库文件是
glfw3.lib。
- 如果是动态链接GLFW,对应导入库通常是
修改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)
- 如果你已经用
确保运行时能找到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
相关产品推荐
相关产品推荐

