# Makefile **Repository Path**: imbit_mathmhb/Makefile ## Basic Information - **Project Name**: Makefile - **Description**: universal makefile - **Primary Language**: 其他 - **License**: LGPL-2.1 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 39 - **Forks**: 1 - **Created**: 2019-12-23 - **Last Updated**: 2025-09-21 ## Categories & Tags **Categories**: ci **Tags**: None ## README # Makefile #### 介绍 universal makefile: unifying building and misc operations with the same Makefile.mhb 这是一个“万能”Makefile项目,通过这个工具,可以不用为你的项目或下载的代码单独编写Makefile或CMakeLists.txt等,从而极大便利于你的项目开发。 通过这个工具,可以快速搭建一个**简单、易用、通用、可扩展的“万能”开发环境**。通过搭配各种常见编程语言的工具链,可作为各种编程语言的统一集成环境。 对于64位Windows用户,可以直接通过下面的链接下载预配置好的统一编程开发环境X以及配套的MinGW64工具链、OpenCV库、PCL库和MTeX套装。 [**统一编程开发环境X**](http://we-learn.net.cn/soft/x.exe) [**MinGW64:X配套C/C++工具链(64位)**](http://we-learn.net.cn/soft/MinGW64.exe) [**MinGW64-OpenCV:X配套OpenCV库V4.7(64位)**](http://we-learn.net.cn/soft/MinGW64-opencv47.exe) [**MinGW64-PCL:X配套PCL库V1.13(64位)**](http://we-learn.net.cn/soft/MinGW64-pcl113.exe) [**MTeX:X配套TeX/LaTeX科技排版系统**](http://we-learn.net.cn/soft/mtex2014.exe) 选我任意课程(*线性系统全英文*、*矩阵代数控制与博弈*、*兵棋与博弈:游戏中的智慧*、*机器视觉与OpenCV实战*、*3D视觉与PCL实战*)或参与大创的同学请直接下载。 将下载的每一个自解压包都解压到d:\,可以运行x\sc1updcfg.bat将Sc1目录的配置文件更新为本仓库中的最新版本。 建议创建x\MyIDE.bat的桌面快捷方式,以快速打开编程环境。 运行x\MyCmd.bat可打开cmd窗口,可以运行命令行工具。 运行x\MyShell.bat可打开busybox提供的shell窗口,可以练习Linux命令(如vi编辑器)。 以上批处理文件自动添加相关可执行文件的目录到PATH环境变量,因此不必手工修改系统环境变量。 #### 软件架构 软件架构说明 #### 安装教程 1. 克隆仓库 cd ~ git clone https://gitee.com/imbit_mathmhb/Makefile 2. 设置账号 git config --global credential.helper "store" git config --global user.email "you@example.com" git config --global user.name "Your Name" git config --global user.password "Your Password" #### 使用说明 1. 在命令行使用万能Makefile智能编译:(Msys2或TDM-GCC下用mingw32-make替换make命令) cd ~/your/prog make -f ~/Makefile/Makefile.mhb 如果是用Linux或者 [Msys2](https://www.msys2.org/), 建议给mhb文件加上可执行权限: chmod a+x ~/Makefile/Makefile.mhb 这样,以后可以编译(或调用其中工具)可不用加make -f或mingw32-make -f,直接用 ~/Makefile/Makefile.mhb 2. 命令行的额外选项:可以用DEBUG指定生成调试符号,X指定交叉编译工具链,C指定编译选项,L指定连接选项 make -f ~/Makefile/Makefile.mhb DEBUG=1 X=arm-linux- C="-Imy/include" L="-Lmy/lib -lmy" 3. 命令行清理所有生成的文件(clean)或中间临时文件(clean_tmp) make -f ~/Makefile/Makefile.mhb clean make -f ~/Makefile/Makefile.mhb clean_tmp 4. 命令行查找未定义符号对应的库:运行后在命令行粘贴undefined symbol的字符串 make -f ~/Makefile/Makefile.mhb _deps #### 万能集成环境Sc1IDE或SciTE中使用万能Makefile 万能集成环境Sc1IDE是MTeX套装自带的编辑器,由作者和qihs共同基于SciTE增加了很多功能和配置。 [SciTE](https://www.scintilla.org/SciTE.html) 是跨平台的最优秀的代码编辑器,小巧而强大,可深度定制。 Makefile.mhb+SciTE搭配,可支持各种语言的编程开发和各种代码文档的编写,形成非常通用的编程开发平台。 方法1:将*.properties*文件和*Makefile.mhb,Makefile.mhb.inc*等文件放到Sc1IDE/SciTE目录中,并通过Options编辑全局配置文件,在最后一行加入 *import zzz_mhb* 方法2:将*.properties*文件和*Makefile.mhb,Makefile.mhb.inc*等文件放到当前用户的家目录中,并通过Options编辑SciTE用户配置文件,加入 *import zzz_mhb* 方法3:只在当前用户的家目录中创建*zzz_mhb.properties*文件的超链接,并通过Options编辑SciTE用户配置文件,加入以下代码: ``` MHB_CFG=1 MHB_DIR=/home/xxx/Makefile (注意改成自己放*Makefile.mhb*的目录) import zzz_mhb ``` 经过以上配置,Tools菜单有以下功能: Compile:快速编译单文件的源程序(一般情况下建议用Build菜单) Build:根据当前文件夹的源程序,自动构建应用或者从tex生成pdf、从md生成html等(建议经常使用) **注意:以前版本该菜单仅仅完成构建功能,最新版本为方便C/C++程序的编译及运行,本菜单将自动在成功构建exe文件后运行程序(激活这一功能需要在命令行指定FILE),可以省略点击Run菜单了。** Go:运行当前文件对应的可执行文件,或者查看生成的pdf、html等文档 Clean:清理构建过程中生成的各种临时文件或生成的pdf文件 Debug with GDB:打开GDB工具进行调试 Run:自动运行当前文件对应的可执行文件(并显示运行时间),或者查看生成的pdf、html等文档 Profiling:对当前文件对应的可执行文件用gprof工具进行运行时间分析,为优化程序提供参考 Lint:检查源程序的语法问题(通过设置lint.xxx理论上可以对各种语言的源文件进行语法检查) Generate tags and api: 通过ctags扫描当前目录中的源程序生成tags文件,并产生用于SciTE自动补全功能的api文件 **Build and Run Remotely**:在服务器上自动构建、运行当前文件对应的可执行文件 **注意:这是增加的新功能(类似VSCode中Remote SSH),在WinScp中直接用SciTE编辑远程服务器上的文件,通过该菜单即可直接在远程服务器上进行程序编译及运行** Command/Shell Prompt:打开命令窗口(Windows)或xterm终端(Linux) Explorer/FileManager:打开资源管理器(Windows)或pcmanfm文件管理器(Linux) Search Enginee:打开网页浏览器搜索所选文本(这是查找各种函数用法或语言帮助的快速途径) Format with Astyle:用astyle工具格式化当前源程序(这是美化程序最快捷的方法) Spell with Aspell:用aspell工具对当前文件进行拼写检查(这是拼写检查最快捷的方法) Git _update:对当前git仓库进行远程更新,使文件夹与服务器最新版保持一致(为避免不必要的代码冲突,建议每次改仓库中的代码前务必先更新!) Git _commit:将当前文件的修改提交到git仓库的服务器(为提交成功,请务必先用前面的命令或者Git _config菜单配置好git用户信息及密码!) Git _config:建议先从Options菜单打开用户配置文件,按以下方式填上git用户信息及密码,存盘后可用本菜单运行git相关命令自动完成配置(不需要手工敲前面第2节设置账号的命令了) ``` git.user.name=xxx git.user.password=yourpass git.user.email=x@y.z git.user.option=--global ``` 以上各种命令需要调用编译器、grep、sed、gdb、ctags、astyle、git等工具,如果提示找不到相关命令,需要自行安装相关工具,并设置系统环境变量PATH。 Linux下以上工具很多发行版已自带,ArchLinux下可通过pacman命令安装缺少的各种工具。 Windows下使用本万能Makefile,建议下载busybox.exe,与Makefile.mhb放在同一目录,这样可以通过busybox提供grep、sed,与TinyC Compiler配合即可搭建出最小的C语言集成环境。 如果在Windows下进行C++的开发,建议安装 [Msys2](https://www.msys2.org/),并通过pacman命令安装gcc编译器以及所需的各种工具,这样可以构建与Linux系统几乎一致的完美开发环境。 #### vim使用万能Makefile vim号称编辑器之神,历经几十年而不落,虽然入门看似不易,但逐渐用熟后会让人叹为观止、难以割舍。 vim是控制台界面下最好的编辑器,图形界面下有gvim。VSCode等新型巨无霸开发环境也有vim插件。 本项目也为SciTE提供了lua语言编写的vim模式,喜欢vi(m)操作方式的用户可修改StartUp.lua来调入相关脚本(支持vim模式或emacs模式)。 本项目针对vim,提供了我个人的vim配置文件*mhb.vim*,运行如下命令即可在用户HOME目录生成.vimrc,使vim启动时自动调入*mhb.vim*: ``` echo source ~/Makefile/mhb.vim > ~/.vimrc ``` 这个vim配置文件的主体是基于*Makefile.mhb*做的热键绑定,其他配置能简则简,尽可能少用插件,遵从KISS原则和“奥卡姆剃刀”思想。 热键绑定原则:提供两组按键,一组为`\\`+字母(取首字母或单词中不造成冲突的字母),一组为函数功能键(与SciTE中设置的快捷键基本保持一致),不常用的功能不设函数功能键。 **配置文件中增加了 F2 键查询按键定义, Ctrl+A 全选, Ctrl+S 存盘, Ctrl+Q 退出当前文件** ** Ctrl+- 切换到上一文件, Ctrl+= 切换到下一文件, Ctrl+9 切换到上一Tab窗口, Ctrl+0 切换到下一Tab窗口** ** \\\\ 或 F7 键编译并运行程序,\+Enter 打开错误信息(Quickfix)窗口, Ctrl+[ 切换到上一错误信息, Ctrl+] 切换到下一错误信息** Build & Run:\\b。根据当前文件夹的源程序,自动**构建并运行应用**或者从tex生成pdf、从md生成html等(建议经常使用) **注意:以前版本仅仅完成构建,最新版本为方便C/C++程序的编译及运行,将自动在成功构建可执行文件后运行程序** Go:\\g 或 F5。运行当前文件对应的可执行文件,或者查看生成的pdf、html等文档 Clean:\\c 或 Shift-F7。清理构建过程中生成的各种临时文件或生成的pdf文件 Debug with GDB:\\d 或 Shift-F9。打开GDB工具进行调试 **已配置用 \\t 激活vim自带的TermDebug,可在vim中无缝进行调试** Run:\\r 或 F9。自动运行当前文件对应的可执行文件(并显示运行时间),或者查看生成的pdf、html等文档 **Build & Run Remotely:\\` 或 Ctrl-F9。在远程服务器上相应目录内自动构建并运行应用** **注意:这是增加的新功能(类似VSCode中Remote SSH),在WinScp中直接用vim编辑远程服务器上的文件,通过该热键即可直接在远程服务器上进行程序编译及运行** Profiling:\\p 或 Alt-F9。对当前文件对应的可执行文件用gprof工具进行运行时间分析,为优化程序提供参考 Lint:\\l 或 Alt-F8。检查源程序的语法问题(通过设置lint.xxx理论上可以对各种语言的源文件进行语法检查) Generate tags: \T。通过ctags扫描当前目录中的源程序生成tags文件,方便在程序中进行函数或符号的跳转(Ctrl+])或跳回(Ctrl+T) Command/Shell Prompt:F8 。打开vim内置的终端窗口,方便运行shell命令 Explorer/FileManager:\\e。打开vim内置的netrw文件浏览器,并可选择文件进行编辑 Search Enginee:\\? 。打开网页浏览器搜索所选文本(这是查找各种函数用法或语言帮助的快速途径) Format with Astyle:\\f 或 Shift-F8。用astyle工具格式化当前源程序(这是美化程序最快捷的方法) Spell with Aspell:\\s 或 Ctrl-F8。用aspell工具对当前文件进行拼写检查(这是拼写检查最快捷的方法) Git _update:\\u 或 F10。对当前git仓库进行远程更新,使文件夹与服务器最新版保持一致(为避免不必要的代码冲突,建议每次改仓库中的代码前务必先更新!) Git _commit:\\m 或 Shift-F10。将当前文件的修改提交到git仓库的服务器(为提交成功,请务必先用前面的命令或者下述命令配置好git用户信息及密码!) Git _config:\\i 。命令行里面填上git用户名、邮箱及密码,按回车后可用本菜单运行git相关命令自动完成配置(不需要手工敲前面第2节设置账号的命令了) Open Alt-File: \\- 和 \\=。\\- 用于快速打开当前文件的相关文件(对C/C++程序打开头文件,对tex文件打开编译后的log文件),\\= 用于从相关文件中切换回原文件 #### 在Windows下搭建自己的通用开发环境(基于MSYS2) 利用本项目提供的文件,可以快速搭建自己的通用开发环境(C/C++/Lua/Python/Perl/Java/Markdown/Html/LaTeX/...)。 上我任何课程的同学,请按此说明完成配置。以下假设机器是64位x86架构。注意:**请禁用360杀毒等软件**。提示:每隔一段时间请运行`pacman -Syu`命令对系统进行更新。 MSYS2官方说明:MSYS2 comes with different environments and the first thing you have to decide is which one to use. The differences among the environments are mainly environment variables, default compilers/linkers, architecture, system libraries used etc. If you are unsure, go with UCRT64. 更新说明:根据MSYS2官方说明,考虑到Win10的普遍应用,以下配置针对ucrt64环境,也就是MSYS2安装后默认运行的环境。 如果希望用mingw64环境,请将下面所有命令或路径中的*ucrt64*替换为*mingw64*,*mingw-w64-ucrt-*替换为*mingw-w64-*。 1. 下载并保存 [Sc1](https://www.scintilla.org/Sc535.exe) 到空目录(如c:\MyIDE) 2. 按前述方法配置SciTE,如把本项目所有文件放到SciTE可执行文件的目录中 3. 从清华源镜像下载并运行 [msys2安装包](https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/msys2-x86_64-latest.exe) ,建议安装到c:\msys64 4. 设置系统环境变量PATH,把 `c:\\msys64\\usr\\bin` 和 `c:\\msys64\\ucrt64\\bin` 放在PATH路径最前面 5. 运行ucrt64.exe,用一行脚本配置pacman使用北外源(如用其他源请替换bfsu.edu.cn):`sed -i -e "/bfsu.edu.cn/! s/^S/#S/" /etc/pacman.d/mirror*`,并更新系统:`pacman -Sy` 6. 用一行脚本装需要的GCC工具链和用到的工具或库(不选视觉课程的可去掉opencv、qt6-base):`for pkg in ninja make gcc gdb astyle ctags cmake opencv qt6-base; do pacman -S --needed --noconfirm mingw-w64-ucrt-x86_64-$pkg; done` 【可自己装其他工具,如运行 `pacman -S make git vim` 来安装make、git工具和vim“神”编辑器】 选修“3D视觉与PCL实战”课程的同学,请继续在ucrt64终端中按以下步骤配置PCL库。为方便开发,请同时下载安装Cloud Compare。 7. 用一行脚本装PCL依赖的一些库:`for pkg in openmp qhull gtest nlohmann-json vtk pdal openblas64 openvdb; do pacman -S --needed --noconfirm mingw-w64-ucrt-x86_64-$pkg; done` 8. 下载flann源代码并构建、安装:`git clone https://gitee.com/haha-web/flann; cd flann; cmake . --fresh -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release --install-prefix /ucrt64; mingw32-make; mingw32-make install; cd ..` 9. 下载PCL源代码并构建、安装:`git clone https://gitee.com/yubaoliu/pcl; cd pcl; test -f .XX || sed -i "/cmake_minimum/a project(PCL LANGUAGES CXX C)\nlink_libraries(-llz4 -latomic)\nfind_package(OpenMP)" CMakeLists.txt && touch .XX; cmake . --fresh -G "Ninja" -DCMAKE_BUILD_TYPE=Release --install-prefix /ucrt64; ninja; ninja install; cd ..` 编译flann和PCL源代码时间视机器配置可能长达数个小时,为方便快速安装PCL库,我为大家分别提供ucrt64环境和mingw64环境下预先编译好的版本(flann 1.9.1,PCL 1.13),前者解压到msys64/urct64目录即可,后者解压到msys64/mingw64目录即可。注意:没必要同时下载两个版本,根据所用的环境下载对应的版本即可。ucrt64环境依赖微软在Win10/Win11自带的UCRT库(支持UTF8编码),mingw64环境依赖各个Windows都提供的MSVCRT库。 **ucrt64环境下编译的PCL库和flann** 链接: https://pan.baidu.com/s/1owfymKbqBMp4FjxHLg0Auw 提取码: 5drf **mingw64环境下编译的PCL库和flann** 链接: https://pan.baidu.com/s/1B3fhiLhB4alADG3O01kbXw 提取码: p3p1 **mingw64环境下编译的PCL库(不含flann)** 链接:https://pan.baidu.com/s/1J2kNGKw2_VO8tc7rIQlBiQ 提取码:oxrd **ucrt64环境下编译的PCL库(不含flann)** 链接: https://pan.baidu.com/s/1oIZk9WrEM5JS83grKecZnQ 提取码: ijuf #### 在Linux下搭建自己的通用开发环境 在ArchLinux(或Manjaro等衍生发行版)下搭建通用开发环境,与上面完全类似,只不过上面提到的所有包都不必自己下载,因为Arch Linux的软件仓库提供了所有的包,可一条命令安装:`sudo pacman -Sy --needed --noconfirm scite vim git ninja make gcc gdb astyle ctags cmake opencv openmp boost eigen qhull qt6-base gtest nlohmann-json vtk pdal openblas openvdb flann`。最后一步安装PCL可直接用Arch Linux的AUR工具来自动下载源代码并构建安装:`yaourt -S pcl`。如果没有安装过yaourt,可访问 [yaourt官网](https://archlinux.fr/yaourt-en/),根据里面的命令来安装。 在Debian、Ubuntu、Alpine、FreeBSD等其他Linux下,没有pacman这样强大的包管理命令,官方软件仓库中的软件数量也远远少于ArchLinux,软件版本也往往老一些。在这些系统上,请用相应的包管理命令查询并安装上面提到的包。对于官方仓库中没有的包,一般需要自己下载或克隆源代码,来编译、构建并安装到系统,没有在ArchLinux上装软件方便。 如果从源代码编译PCL,可用如下命令:`git clone https://gitee.com/yubaoliu/pcl; cd pcl; test -f .XX || sed -i "/cmake_minimum/a project(PCL LANGUAGES CXX C)\nlink_libraries(-llz4 -latomic)\nfind_package(OpenMP)" CMakeLists.txt && touch .XX; cmake . --fresh -G "Ninja" -DCMAKE_BUILD_TYPE=Release --install-prefix /usr/local; ninja; sudo ninja install` #### 在Mac OS下搭建自己的通用开发环境 在Mac OS下需要先安装 [XQuartz](https://www.xquartz.org) 和 [MacPorts](https://guide.macports.org),建议使用[清华源](https://mirrors.tuna.tsinghua.edu.cn/macports/),然后用`sudo port install scite `来安装SciTE。在XQuartz中运行SciTE,按前面说明进行SciTE的配置。 用`sudo port install opencv4-devel `来安装OpenCV。 用`sudo port install flann `来安装flann库。 #### 远程编辑与运行服务器端上的程序代码 很多人喜欢用VSCode的一个关键原因是通过Remote-SSH插件能直接编辑服务器上的程序代码并在服务器端运行程序,但大部分人不了解其工作原理(如Electron 框架、Language Server Protocol),也不知道服务器端将为此功能额外消耗至少数百兆字节的硬盘空间并增加一堆扩展进程占用太多cpu、内存、IO资源。当然,能用Remote-SSH的前提还包括有权限在远程机器安装vscode,同时也需要有很好的网络速度。 其实,利用前面配置的通用开发环境SciTE或vim,最简单、最轻量、最高效的方式是WinSCP,在WinSCP中将SciTE或vim设置为默认编辑器,浏览服务器端目录时按F4键直接编辑选中的文件即可。编辑过程中只要存盘,服务器上的文件将自动同步更新。在服务器端运行程序只需要用Shift+Ctrl+T打开控制台终端或用Ctrl+P打开Putty终端,运行程序的命令一般只需键入一次即可。后面再次运行只需要用上箭头键呼出历史命令即可。 **更新提示:根据上述原理,本项目最新版本已在SciTE中增加工具“Build and Run Remotely”,能够直接通过SSH在服务器端直接构建运行!!** #### 关于Python开发与包管理 前面配置的通用开发环境SciTE或vim已能进行Python开发,因此原则上**不需要再安装任何别的Python开发环境**。 为避免出现不必要的错误,也为了大大减少电脑资源的占用,**我不建议使用Anaconda、Pycharm等巨无霸软件**,若已安装这样的软件,建议将其卸载。 由于Windows下Anaconda极其糟糕的设计,**卸载Anaconda后会造成运行cmd闪退的严重问题**,请**以管理员权限打开PowerShell**,输入以下命令恢复被破坏的注册表设置: `C:\Windows\System32\reg.exe DELETE "HKCU\Software\Microsoft\Command Processor" /v AutoRun /f` 可参考 [由anaconda卸载引起的command prompt闪退问题](https://blog.csdn.net/tanmx219/article/details/124297644) 由于MSYS2或ArchLinux的官方软件仓库或用户软件仓库中提供了大量的Python包,所以进行Python开发时如果程序提示缺少某些包,请先用pacman或yaourt来搜索并安装。 **注意:只有在官方软件仓库或用户软件仓库中没有所需要的包时,才需要使用Python官网推荐的pip命令安装相应的包。建议用`python -m venv venv;. venv/bin/activate`创建并激活虚拟环境,在虚拟环境中用pip命令安装仓库中没有的包。** 安装pip:ArchLinux下用`sudo pacman -S python-pip`,MSYS2/ucrt64环境下`pacman -S mingw-w64-ucrt-x86_64-python-pip`,MSYS2/mingw64环境下`pacman -S mingw-w64-x86_64-python-pip`。 经测试,目前MSYS2中缺乏预编译好的PyTorch深度学习框架(因wheel二进制包不支持MinGW),对此类应用,可下载**WinPython**这一便携、绿色、强大、相对小巧的Python发行版,解压,并可将winpython可执行文件的目录加到PATH最前面。这样在前面配置的通用开发环境SciTE或vim里面运行python程序时即调用winpython。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)