M1 Mac平台下使用Conan管理依赖编译GLFW+C++项目失败求助
解决M1 Mac上Conan+CMake构建GLFW/OpenGL项目的链接错误
你在M1 Mac上构建GLFW+OpenGL项目时遇到的两次链接错误,本质都是CMake没有正确处理Conan提供的GLFW依赖路径和链接规则,下面是一步步的针对性解决方法:
问题根源拆解
- 第一次错误(未定义GLFW符号):初始
CMakeLists.txt仅调用了conan_basic_setup(),但没有明确将GLFW库链接到可执行文件,导致链接器找不到GLFW的函数实现。 - 第二次错误(找不到-lglfw3):修改后的配置手动添加了
-lglfw3并重复链接了GLFW库和系统框架。Conan已经通过CONAN_PKG::glfw目标封装了所有依赖(包括Mac必需的Cocoa/IOKit等框架),手动添加的-lglfw3会让链接器去系统默认路径找库,而Conan安装的GLFW在本地缓存中,自然找不到。
分步解决方案
步骤1:清理旧构建缓存
先删除现有build目录,避免旧配置干扰:
rm -rf build mkdir build && cd build
步骤2:修正conanfile.txt
你的代码未用到GLM,移除不必要依赖,同时改用更适配现代CMake的生成器:
[requires] glfw/3.3.6 [generators] cmake_find_package cmake_paths
步骤3:正确配置CMakeLists.txt
使用Conan现代集成方式,让CMake自动处理依赖路径和链接规则:
cmake_minimum_required(VERSION 3.22) project(opengl-by-glfw) # 配置C++标准(你的代码用C++11也可,推荐更新版本) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 引入Conan生成的配置文件 set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR} ${CMAKE_MODULE_PATH}) set(CMAKE_PREFIX_PATH ${CMAKE_BINARY_DIR} ${CMAKE_PREFIX_PATH}) # 下载Conan CMake集成脚本(本地无则自动下载) if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake") message(STATUS "Downloading conan.cmake from conan-io/cmake-conan") file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.17.0/conan.cmake" "${CMAKE_BINARY_DIR}/conan.cmake" EXPECTED_HASH SHA256=396e16d0f5eabdc6a14afddbcfff62a54a7ee75c6da23f32f7a31bc85db23484 TLS_VERIFY ON) endif() include(${CMAKE_BINARY_DIR}/conan.cmake) # 自动检测M1架构并安装依赖 conan_cmake_autodetect(settings) conan_cmake_run(CONANFILE ../conanfile.txt BASIC_SETUP NO_OUTPUT_DIRS CMAKE_TARGETS BUILD missing SETTINGS ${settings}) # 查找依赖 find_package(OpenGL REQUIRED) find_package(glfw3 REQUIRED) # 创建可执行文件并链接依赖 add_executable(opengl-by-glfw src/main.cpp) target_link_libraries(opengl-by-glfw PRIVATE OpenGL::GL glfw ) # 导出编译命令(可选,用于代码编辑器LSP) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
步骤4:执行构建命令
在build目录下依次运行:
# 生成CMake配置 cmake -G Ninja .. # 编译项目 ninja
M1 Mac额外适配(若仍有架构问题)
如果Conan出现架构不匹配,手动创建M1专属profile:
- 在
~/.conan/profiles/下创建arm64文件,内容如下:
[settings] os=Macos os.version=12.1 arch=armv8 compiler=apple-clang compiler.version=13.0 compiler.cppstd=17 build_type=Release
- 构建时指定该profile:
conan_cmake_run(CONANFILE ../conanfile.txt BASIC_SETUP NO_OUTPUT_DIRS CMAKE_TARGETS BUILD missing PROFILE arm64)
验证运行
编译完成后执行:
./bin/opengl-by-glfw
你会看到一个短暂显示的窗口(代码中延迟循环后即终止),无报错则说明构建成功。
内容的提问来源于stack exchange,提问作者javaboy
相关产品推荐
相关产品推荐

