如何在CMake中链接库?Linux迁移至Windows的C++项目GLFW链接失败问题求助
解决Windows下CMake链接GLFW失败的问题
首先,你遇到的核心问题是pkg-config在Windows环境下默认不生效——它是Linux/Unix生态里的工具,Windows下没有默认配置GLFW的.pc文件路径,所以pkg_search_module找不到GLFW。下面给你两种靠谱的解决方案,以及Windows下CMake链接外部库的通用思路。
方案一:用CMake原生的find_package替代pkg-config(推荐,跨平台友好)
这种方法不需要依赖pkg-config,更符合Windows下CMake的使用习惯,步骤如下:
确认GLFW库的结构:确保你下载的GLFW预编译包(或自己编译的)有完整的目录结构,比如:
C:/libs/GLFW/ ├── include/ │ └── GLFW/ │ └── glfw3.h └── lib-mingw-w64/ # 如果你用MinGW编译器,MSVC的话是lib-vc2022这类目录 ├── libglfw3.a └── glfw3.dll修改你的CMakeLists.txt:替换掉pkg-config相关的代码,手动指定GLFW路径或者用
find_package:cmake_minimum_required(VERSION 3.10) project(PackMan) # 设置第三方库路径 set(GLM_DIR C:/libs/GLM/glm) set(GLFW_DIR C:/libs/GLFW) # 改成你的GLFW根目录 set(GLAD_DIR C:/libs/GLAD/include) # 添加头文件目录 include_directories(${GLM_DIR}) include_directories(${GLAD_DIR}) include_directories(${GLFW_DIR}/include) # 添加库文件搜索路径(根据你的编译器选对应的lib目录) link_directories(${GLFW_DIR}/lib-mingw-w64) # 如果你编译GLFW时生成了CMake配置文件,也可以用下面这行代替上面的include和link目录设置 # find_package(glfw3 REQUIRED PATHS ${GLFW_DIR}) # 编译静态库和可执行文件 add_library(mainScr scr/Carte.cpp scr/Enemy.cpp scr/MoveableSquare.cpp scr/Palette.cpp scr/Player.cpp scr/Square.cpp scr/Wall.cpp scr/glad.c ) add_executable(PackMan scr/main.cpp) # 链接GLFW和自定义库 target_link_libraries(PackMan PRIVATE glfw3 mainScr)处理DLL文件:把GLFW的
glfw3.dll复制到你的项目build目录(比如cmake-build-debug),而不是放到system32——这样更干净,也避免版本冲突。
方案二:配置pkg-config在Windows下生效
如果你坚持要用pkg-config,可以按以下步骤配置:
- 安装pkg-config工具:从MSYS2或者GnuWin32下载pkg-config,把它的bin目录加到系统PATH里。
- 创建GLFW的.pc文件:在GLFW的lib目录下新建
glfw3.pc,内容如下(替换成你的实际路径):prefix=C:/libs/GLFW exec_prefix=${prefix} libdir=${exec_prefix}/lib-mingw-w64 includedir=${prefix}/include Name: GLFW Description: Multi-platform OpenGL window library Version: 3.3.8 Libs: -L${libdir} -lglfw3 Cflags: -I${includedir} - 设置环境变量:添加
PKG_CONFIG_PATH环境变量,值为glfw3.pc所在的目录,然后重启CLion让环境变量生效。
Windows下CMake链接外部库的通用要点
- 优先用
find_package:大部分主流库(比如GLFW、GLM现在也支持)都提供了CMake配置文件,用这个方法跨平台性最好,Linux/Windows都能兼容。 - 手动指定路径时要注意编译器差异:MinGW和MSVC的库文件格式不一样(.a vs .lib),对应的lib目录也不同,要选对路径。
- DLL文件的放置:尽量把DLL放在可执行文件同目录,或者设置
CMAKE_RUNTIME_OUTPUT_DIRECTORY统一输出路径,不要随便放system32。
内容的提问来源于stack exchange,提问作者Onur Kulan
相关产品推荐
相关产品推荐

