Bootstrap

GAMES101 作业环境配置指北 (Mac M1)

GAMES101 作业环境配置指北 (Mac M1)

背景说明

GAMES101 课程官方提供了配置好的 Linux 虚拟机环境(Ubuntu 18.04.2 64bit),可以通过以下方式获取:

  • 百度网盘链接: https://pan.baidu.com/s/1egzD3Z87ZwX4IMiGPsQgnw?pwd=rrf3
  • 提取码: rrf3

但虚拟机方案存在以下问题:

  1. 占用大量存储空间
  2. 百度网盘下载速度慢

因此,我选择直接在 Mac M1 芯片上直接配置原生开发环境。

本地环境配置

安装包管理器

Mac 上我们使用 Homebrew 作为包管理器,类似于 Linux 中的 apt-get 和 yum。

  1. 官方安装命令(国外源):
/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

安装必要依赖

  1. 安装 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
    
  2. 安装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 构建
  1. 安装 CMake:
brew install cmake
  1. 创建 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)
  1. 构建步骤:
# 创建并进入构建目录
mkdir build && cd build

# 生成构建系统
cmake ..

# 编译
make
4. VSCode 配置(推荐)

在VScode中运行调试C++最为方便,同时配置环境更为麻烦一点。
在打开cpp文件的时候,VScode会自动安装所需要的拓展。
我们要做的是配置.vscode文件下的几个文件,告诉vscode我们要用什么东西,他们放在哪里。

  1. 必要的 VSCode 扩展:

    • C/C++
    • C/C++ Extension Pack
    • CMake Tools(如果使用 CMake)
  2. 配置文件设置:

.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>

常见问题解决

  1. Eigen 头文件找不到

    • 检查 Eigen 是否正确安装:ls /opt/homebrew/include/eigen3
    • 确认包含路径是否正确配置在json中
    • VSCode 可能需要重新加载窗口:Command + Shift + P,输入 “Reload Window”
  2. 编译错误

    • 确保使用了正确的编译器(g++ 或 clang++)
    • 检查是否包含了所有必要的头文件
    • 确认 C++ 标准设置正确
  3. 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
    
    
;