Apple M1 CLion编译gRPC C++架构不匹配如何配置CMake
问题原因
- 架构配置变量放置位置错误:
CMAKE_SYSTEM_PROCESSOR、CMAKE_SYSTEM_NAME、CMAKE_OSX_ARCHITECTURES这类平台检测相关的全局变量,必须放在project()命令之前声明。project()执行时会完成系统平台、架构的初始化检测,写在project()之后的配置不会生效,这是你配置不生效的核心原因。 - 链接的gRPC库架构不匹配:你当前引用的
/usr/local/Cellar/grpc/1.33.2_1/lib下的gRPC库是x86_64架构的,是Intel版本Homebrew安装的产物,Apple M1芯片原生的Homebrew默认安装路径为/opt/homebrew,安装的包才是arm64架构。
解决方案
1. 修正CMakeLists.txt配置
把架构相关配置移到最开头,修正后的配置参考如下:
cmake_minimum_required(VERSION 3.20) # 所有平台架构相关配置必须放在project()之前 set(CMAKE_SYSTEM_NAME Darwin) set(CMAKE_SYSTEM_PROCESSOR arm64) set(CMAKE_OSX_ARCHITECTURES arm64) set(CMAKE_CXX_STANDARD 17) project(grpc_test) # 替换为M1原生Homebrew安装的openssl路径,版本号对应你实际安装的版本即可 set(OPENSSL_ROOT_DIR /opt/homebrew/Cellar/openssl@1.1/1.1.1i) set(OPENSSL_INCLUDE_DIR /opt/homebrew/Cellar/openssl@1.1/1.1.1i/include) find_package(PkgConfig REQUIRED) # 推荐直接用find_package管理依赖,避免手动指定路径出错 find_package(Protobuf REQUIRED) find_package(gRPC REQUIRED) add_executable(grpc_test main.cpp svc.grpc.pb.cc svc.pb.cc) target_include_directories(grpc_test PUBLIC ./ /opt/homebrew/include) # 替换为M1原生Homebrew安装的grpc路径,版本号对应你实际安装的版本即可 target_link_directories(grpc_test PUBLIC /opt/homebrew/Cellar/grpc/1.33.2_1/lib) target_link_libraries(grpc_test grpc++) message(STATUS "archs is " ${CMAKE_OSX_ARCHITECTURES})
2. 安装arm64架构的依赖包
使用M1原生Homebrew重新安装所需依赖:/opt/homebrew/bin/brew install grpc openssl protobuf
如果你的终端默认已经是原生arm64环境,直接执行brew install grpc openssl protobuf即可。
3. 清空CMake缓存重生成
CLion中点击菜单栏File -> Invalidate Caches...,选择清除缓存并重启,或者手动删除项目下的cmake-build-debug文件夹,之后重新加载CMake项目再构建即可。
如果不需要原生arm64构建,也可以将CMAKE_OSX_ARCHITECTURES改为x86_64,直接通过Rosetta转译运行,不需要替换依赖包。
内容的提问来源于stack exchange,提问作者jackme
相关产品推荐
相关产品推荐

