GAMES101 作业环境配置指北 (Mac M1)
文章目录
背景说明
GAMES101 课程官方提供了配置好的 Linux 虚拟机环境(Ubuntu 18.04.2 64bit),可以通过以下方式获取:
- 百度网盘链接: https://pan.baidu.com/s/1egzD3Z87ZwX4IMiGPsQgnw?pwd=rrf3
- 提取码: rrf3
但虚拟机方案存在以下问题:
- 占用大量存储空间
- 百度网盘下载速度慢
因此,我选择直接在 Mac M1 芯片上直接配置原生开发环境。
本地环境配置
安装包管理器
Mac 上我们使用 Homebrew 作为包管理器,类似于 Linux 中的 apt-get 和 yum。
- 官方安装命令(国外源):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
这个源在国外,我安装的时候连不上服务器,于是用国内镜像安装,安装方法参考链接: zhihu
2. 国内镜像源安装(推荐):
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
安装完成后,验证安装:
brew --version
安装必要依赖
-
安装 Eigen(线性代数库):
brew install eigen
Eigen 库会被安装在
/usr/local/include/eigen3
目录下,用ls命令查看安装是否成功:ls /opt/homebrew/include/eigen3
这里直接用g++编译了一下作业0的main.cpp,指定了eigen3 路径,可以生成可执行文件main
g++ -I/opt/homebrew/include/eigen3 main.cpp -o main
-
安装opencv
安装最新版本的openCV会由于C++标准不一样 导致和老师的代码不兼容brew install opencv
建议安装opencv@3,完美兼容
brew install opencv@3
opencv库安装在
/opt/homebrew/opt/opencv/include/opencv4
目录下。接下来把open库正确添加到配置文件中,就可以通过头文件调用了。
到这里都非常简单,运行很顺利。但是我用VScode的时候明明指定了路径但是它依然死活找不到包含Eigen头文件的路径,一直报错无法运行。由于我一直用python这种傻瓜式操作,对C++的编译懵懵的,然后找不到问题在哪,我下面记录一下。
配置编译环境
1. 命令行直接编译
最简单但最不方便的方式:
g++ -I/opt/homebrew/include/eigen3 main.cpp -o main
直接在命令行敲g++命令会非常麻烦,因为每次敲一遍很长的代码很容易出错,尤其是大型项目。但是下面有几种方法可以解决这个问题。
2. Makefile 构建
把命令写到makefile文件中,每次编译只需要在终端输入 make 就可以生成可执行文件。
创建 Makefile
:
CXX = g++
CXXFLAGS = -I/opt/homebrew/include/eigen3
TARGET = main
SRCS = main.cpp
$(TARGET): $(SRCS)
$(CXX) $(CXXFLAGS) $(SRCS) -o $(TARGET)
clean:
rm -f $(TARGET)
使用:
make # 编译
make clean # 清理
3. CMake 构建
- 安装 CMake:
brew install cmake
- 创建
CMakeLists.txt
:
cmake_minimum_required(VERSION 3.10)
project(GAMES101_PA0)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 设置 Eigen 路径
include_directories(/opt/homebrew/include/eigen3)
# 添加可执行文件
add_executable(main main.cpp)
- 构建步骤:
# 创建并进入构建目录
mkdir build && cd build
# 生成构建系统
cmake ..
# 编译
make
4. VSCode 配置(推荐)
在VScode中运行调试C++最为方便,同时配置环境更为麻烦一点。
在打开cpp文件的时候,VScode会自动安装所需要的拓展。
我们要做的是配置.vscode文件下的几个文件,告诉vscode我们要用什么东西,他们放在哪里。
-
必要的 VSCode 扩展:
- C/C++
- C/C++ Extension Pack
- CMake Tools(如果使用 CMake)
-
配置文件设置:
.vscode/c_cpp_properties.json
这个文件是给 VSCode 的 IntelliSense(智能提示)使用的,它只帮助 VSCode 理解代码,提供代码补全、语法检查等功能,并不影响实际的编译过程
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/opt/homebrew/include/eigen3",
"/opt/homebrew/opt/opencv/include/opencv4"
],
"defines": [],
"macFrameworkPath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang++",
"cStandard": "c17",
"cppStandard": "c++11",
"intelliSenseMode": "macos-clang-arm64"
}
],
"version": 4
}
.vscode/tasks.json
这个文件定义了实际的编译命令,它告诉编译器(g++)在哪里找到头文件和库文件,直接影响编译过程
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"args": [
"-std=c++11",
"-fdiagnostics-color=always",
"-g",
"${file}",
"${fileDirname}/rasterizer.cpp",
"-I/opt/homebrew/include/eigen3",
"-I/opt/homebrew/opt/opencv/include/opencv4",
"-L/opt/homebrew/opt/opencv/lib",
"-lopencv_core",
"-lopencv_imgcodecs",
"-lopencv_imgproc",
"-lopencv_highgui",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
.vscode/launch.json
(用于调试):
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++: g++ build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "C/C++: g++ build active file"
}
]
}
然后把头文件路径改一下,就发现vscode能找到路径了,现在可以愉快做作业了。
#include<cmath>
#include<Eigen/Dense>
#include<Eigen/Core>
#include<iostream>
常见问题解决
-
Eigen 头文件找不到
- 检查 Eigen 是否正确安装:
ls /opt/homebrew/include/eigen3
- 确认包含路径是否正确配置在json中
- VSCode 可能需要重新加载窗口:Command + Shift + P,输入 “Reload Window”
- 检查 Eigen 是否正确安装:
-
编译错误
- 确保使用了正确的编译器(g++ 或 clang++)
- 检查是否包含了所有必要的头文件
- 确认 C++ 标准设置正确
-
error OpenCV 4.x+ requires enabled C++11 support
我安装的是最近版本的OpenCV,根据报错信息OpenCV 4.x+ 需要C++11标准brew info opencv ==> opencv: stable 4.10.0 (bottled), HEAD
需要g++ 指定标准,在task.json中arg第一行加入"-std=c++11" 即可
但是这里有个大坑,因为作业的代码是更高的C++标准,所以还要给代码改成C++11标准……,要么一开始就别装最新版本的opencv,可以装个opencv@3 应该就可以兼容老师给的代码了。brew install opencv@3