glfw-3.3.5 M1芯片arm64架构Undefined symbols编译错误求解
错误根因排查
- CMake链接指令使用错误:你声明的可执行目标名为小写
game,但link_libraries中错误使用了大写Game作为目标名;且link_libraries是全局链接配置指令,针对单个目标指定链接库应该使用target_link_libraries。 - 仅配置了依赖头文件路径,未实际编译/链接依赖库文件:你只将glew、glfw的头文件和源码目录加入了头文件搜索路径,但没有将源码编译进目标,也没有链接预编译好的glfw、glew库文件。
- 缺少macOS平台必要的系统框架链接:OpenGL相关功能在macOS上需要依赖
OpenGL、Cocoa、IOKit、CoreVideo等系统框架,你未在链接配置中加入这些依赖。 - 依赖架构不匹配:如果你使用的glfw、glew是预编译的x86_64版本,在M1 arm64架构下也会报符号找不到错误。
修复方案
1. 修改CMakeLists.txt配置
替换为以下内容,可选择源码编译依赖或调用homebrew安装的预编译依赖:
cmake_minimum_required(VERSION 3.12) project(Game VERSION 1.0.0) set(PROJECT_DEPS "${PROJECT_SOURCE_DIR}/deps") set(glew_dir "${PROJECT_DEPS}/glew-2.1.0") set(glfw_dir "${PROJECT_DEPS}/glfw-3.3.5") set(glm_dir "${PROJECT_DEPS}/glm") # 头文件路径配置 include_directories( ${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR} ${glm_dir} ${glew_dir}/include ${glfw_dir}/include ) # 源码编译glew add_library(glew STATIC ${glew_dir}/src/glew.c) target_compile_definitions(glew PRIVATE GLEW_STATIC) # 源码编译glfw add_subdirectory(${glfw_dir} ${CMAKE_BINARY_DIR}/glfw) # 生成可执行目标 add_executable(game main.cpp) # 链接所有依赖,包含macOS系统框架 target_link_libraries(game PRIVATE glew glfw "-framework OpenGL" "-framework Cocoa" "-framework IOKit" "-framework CoreVideo" )
如果你不想源码编译依赖,可通过homebrew安装arm64版本的glfw、glew:执行brew install glfw glew后,将CMake配置中源码编译部分替换为find_package(glfw3 REQUIRED)、find_package(GLEW REQUIRED)即可。
2. 修正main.cpp头文件包含
将原glfw、glew的头文件包含改为标准层级写法:
#include <stdio.h> #include <stdlib.h> #include <GL/glew.h> #include <GLFW/glfw3.h> #include <GLFW/glfw3native.h> #include <glm/glm.hpp> // 原有业务逻辑保留
3. 重新编译
删除原有build目录缓存,重新执行cmake生成配置后再运行make即可正常编译。
内容的提问来源于stack exchange,提问作者MattC
相关产品推荐
相关产品推荐

