
1. 错误根因剖析不只是一个“找不到文件”这么简单先描述一下这个错误的经典出场方式你写了一段基于PROJ库做坐标系转换的代码无论是C直接调用、通过QGIS二次开发接口还是间接依赖GDAL/OGR库程序一跑起来控制台直接甩出一行红字ERROR 1: PROJ: proj_create_from_database: Cannot find proj.db更具体一点在QGIS插件开发或者独立C程序里你可能会看到带路径的变体比如提示在某个指定目录下找不到proj.db文件。很多第一次遇到这个问题的朋友会愣住第一个念头是“PROJ库没装好”或者“代码写错了”然后开始一通乱试。实际上这个错误的本质非常简单PROJ库在初始化坐标系统时需要加载一个名为proj.db的SQLite数据库文件它是PROJ 6.0以上版本的核心数据文件里面存储了所有坐标参考系的定义、椭球体参数、基准面转换关系、单位定义等元数据。如果你的程序在运行环境中找不到这个数据库文件库就无法完成坐标系的创建和转换于是果断抛错。为什么PROJ库要依赖这个外部数据库文件这要从PROJ库的架构变化说起。PROJ 6.0之前的版本坐标参考系的定义是硬编码在库内部的每个坐标系对应一个固定的WKT字符串或EPSG编号调用时直接读取。但从PROJ 6.0开始官方将所有坐标参考系的元数据迁移到了proj.db这个SQLite数据库中。这样做的好处是数据与代码解耦新增坐标系、修正参数无需重新编译整个库通过更新数据库文件就能实现同时支持更灵活的查询比如通过国家代码、坐标系统类型等条件检索。代价就是——程序运行时对数据库文件的依赖变得非常强文件路径一旦不对整个库立刻“瘫痪”。从工程角度看这个报错绝大多数出现在开发环境配置不当或部署环境不完整的场景而不是PROJ库本身损坏。搞清楚这一点你就知道修复方向不是重装PROJ库而是把查找路径和环境变量理清楚。这里有一个需要强化的概念PROJ库查找proj.db的顺序和规则是什么它并不像部分软件那样只认一个固定目录而是有一套自己的搜索逻辑。大致顺序是通过PROJ_DATA环境变量指定的路径通过PROJ_LIB环境变量指定的路径老版本PROJ或某些编译版本仍会读取通过编译时写入的默认数据路径比如Linux下通常是/usr/local/share/proj或/usr/share/projWindows下则是安装目录下的share\proj或data文件夹在某些绑定场景下比如pyproj、GDAL的PROJ集成通过Python包或动态库自身的相对路径查找。如果以上所有路径都找不到proj.dbPROJ就认为数据库缺失抛出你看到的Cannot find proj.db。值得注意的是这个查找过程还区分“哪个PROJ在被调用”。比如你用QGISQGIS内置了一套PROJ系统你独立写程序链接了系统安装的PROJ库你用Python的pyproj库它可能自带一个PROJ库和对应的proj.db。这三套PROJ之间互不相干各自有各自的查找路径。所以很多人遇到“QGIS里能用自己的程序里却报错”“pyproj能用命令行工具却报错”的情况本质上是不同环境下PROJ库各自独立查找而某一套的路径没配置好。再深入一点还有可能出现多版本PROJ库并存的情况。比如系统本身有PROJ 7你又在conda环境里装了一个PROJ 9程序动态链接时链接到了旧版本但数据路径却指向新版本的目录导致版本不匹配。这种问题比单纯环境变量缺失更隐蔽排查起来也更费劲。我后面会专门讲。所以修复这个错误的完整思路是第一确认程序运行时实际使用的是哪个PROJ库第二确认该PROJ库版本对应的proj.db文件在哪里第三通过环境变量或路径配置让程序能准确找到它。这三个步骤缺一不可很多人第一步就搞混了才会陷入“改了半天环境变量还是报错”的死循环。2. 环境变量配置详解PROJ_DATA与PROJ_LIB的正确玩法环境变量是解决这个问题的核心手段但很多教程一笔带过导致读者只知其然不知其所以然。这里先从底层逻辑讲起。2.1PROJ_DATA为什么是首选从PROJ 8.1版本开始官方明确推荐使用PROJ_DATA环境变量来指定数据文件目录替代早期的PROJ_LIB。PROJ_DATA指向的目录应该直接包含proj.db文件而不是包含proj.db的上级目录。这一点非常关键我见过很多人把PROJ_DATA设置成了C:\Program Files\proj但proj.db实际在C:\Program Files\proj\share\proj里结果程序依旧报错。官方在PROJ文档中对查找逻辑的描述是在初始化时PROJ会检查PROJ_DATA环境变量如果有定义并且该目录下存在proj.db就直接使用否则检查PROJ_LIB如果两者都没有就回到编译时的默认路径。在Windows下默认路径通常是C:\Program Files\proj\share\proj或编译时用CMAKE_INSTALL_PREFIX指定的路径拼上share\proj。因此最稳妥的做法是把PROJ_DATA设置为proj.db文件所在的目录绝对路径而不是任意PROJ安装根目录。例如在Linux下如果你的proj.db在/usr/local/share/proj/proj.db那么PROJ_DATA/usr/local/share/projWindows下如果文件在D:\libs\proj\share\proj\proj.db那么PROJ_DATAD:\libs\proj\share\proj。2.2 Linux/macOS下的配置方法在Linux系统如Ubuntu、CentOS上如果你通过包管理器安装PROJsudo apt install proj-bin libproj-dev proj-data # Ubuntu/Debian对应的proj.db一般会被安装到/usr/share/proj/proj.db某些发行版是/usr/local/share/proj/proj.db。验证方法find /usr -name proj.db 2/dev/null找到位置后配置环境变量推荐写入用户级配置文件~/.bashrc或~/.zshrcexport PROJ_DATA/usr/share/proj写完后执行source ~/.bashrc再用projinfo命令验证projinfo EPSG:4326如果能正常输出WKT内容说明PROJ已经能找到数据库了。如果依然报同样错误确认一下proj.db的实际路径是否和你配置的一致别想当然。macOS下如果通过Homebrew安装brew install projproj.db通常在/opt/homebrew/share/proj/proj.dbApple Silicon或/usr/local/share/proj/proj.dbIntel配置方式和Linux一致。2.3 Windows下的配置方法Windows下如果你使用OSGeo4W安装QGIS或其开发套件proj.db一般在C:\OSGeo4W\share\proj\proj.db如果你用conda安装了proj或pyproj则位于conda环境目录下的Library\share\proj\proj.db如果你手动下载了PROJ的Windows二进制包并解压到D:\proj那通常会在D:\proj\share\proj\proj.db。配置步骤按Win X选择“系统”左侧点击“高级系统设置”点击“环境变量”在“系统变量”或“用户变量”区点击“新建”变量名填PROJ_DATA变量值填proj.db所在目录的完整路径比如C:\OSGeo4W\share\proj确定保存并重启你的终端或IDE否则环境变量不会生效。这里有个坑某些Windows环境下如果你的程序是从图形界面直接启动的比如双击exe或Qt Creator里直接运行它继承的环境变量来自注册表/系统环境配置不是终端当前会话。改了系统环境变量后需要重新启动程序或IDE才能读到那当然不是“改了没生效”的锅。2.4 JDK/Python等开发环境叠加场景这个错误在开发场景中经常和各种其他环境变量叠加出现。比如在Java项目里调用GDAL库做投影转换又配置了JAVA_HOME、PATH等一套环境变量在Python项目里用pyproj又有PROJ_LIB或CONDA_PREFIX等变量。这些变量之间会互相干扰吗一般情况下不会但需要注意优先级。实际经验是pyproj等高级封装库往往会覆盖手动设置的环境变量。比如你用conda安装了pyproj它内部会优先使用自己包内捆绑的proj.db手动设置的PROJ_DATA未必能生效。这种情况下与其折腾环境变量不如直接检查pyproj的版本和数据库路径import pyproj print(pyproj.proj_version_str) print(pyproj.datadir.get_data_dir()) # 要看最新版本API是否一致如果pyproj自带的数据库版本和你系统PROJ库不一致可能会出现转换结果差异。最好的做法是统一使用一套PROJ环境避免混用。另一个典型的叠加场景是你同时装了Anaconda和系统级PROJ。当你激活conda环境后PATH最前面是conda的bin目录里面可能有conda自己的proj命令和相关库。如果此时PROJ_DATA还指向系统路径PROJ版本被conda环境覆盖后数据库版本可能对不上。这种“版本错位”问题我建议直接在conda环境里重新安装匹配的proj而不是手动改PROJ_DATAconda install -c conda-forge projconda会自动在环境内部放好proj.db并调整库搜索路径省心很多。2.5 Docker容器内的配置要点Docker场景更特殊。基础镜像比如osgeo/gdal或ubuntu自己装PROJ里proj.db的路径是固定的但容器运行时环境变量往往没有设置程序一跑就报Cannot find proj.db。解决办法就是在Dockerfile里显式设置环境变量或者启动容器时用-e参数传入。例如Dockerfile中ENV PROJ_DATA/usr/share/proj或者运行容器时docker run -e PROJ_DATA/usr/share/proj -v /host/proj/data:/opt/proj_data myimage如果你把外部的proj.db挂载进容器要注意挂载目录的权限和路径。我遇到过一个案例挂载成功后ls能看到文件但PROJ仍然报错。最后排查发现挂载时不小心把proj.db挂成了一个0字节的空文件因为宿主机路径写错了程序打不开SQLite数据库虽然报错不那么直接但同样无法工作。这里给个经验挂载后先进入容器用python3 -c import sqlite3; sqlite3.connect(/path/proj.db).execute(select count(*) from proj)快速验证文件是否是合法SQLite数据库能省下不少排查时间。3. 路径修复实操从定位文件到多场景根治环境变量配置说完了现在进入最核心的实操环节。这一章我要把“定位proj.db文件”“验证PROJ库能否正常工作”“针对不同调用方式做修复”整套流程都过一遍给出可以直接复制的命令和步骤。3.1 第一步精准定位系统里的proj.db无论什么操作系统第一步都是先找到机器上到底有哪些proj.db。这个文件是SQLite格式通常大小在几十MB到上百MB之间。Linux/macOS下用find或locatefind / -name proj.db -type f 2/dev/null如果系统装了多个PROJ版本或Python环境这个命令可能会列出多个路径。建议重点关注这几个候选位置/usr/share/proj/proj.db系统包管理器安装/usr/local/share/proj/proj.db源码编译安装/opt/conda/share/proj/proj.dbconda基础环境~/miniconda3/envs/your_env/share/proj/proj.dbconda虚拟环境/opt/homebrew/share/proj/proj.dbmacOS HomebrewWindows下用Everything搜索工具或者命令行where /r C:\ proj.db或者更简单地用PowerShellGet-ChildItem -Path C:\ -Filter proj.db -Recurse -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName看到多个结果不用紧张关键在于找出你的程序正在使用哪个PROJ库再确定它对应的proj.db是哪一份。3.2 第二步确认程序调用的是哪个PROJ库这是整个修复流程中最容易翻车的一步。很多人对着PROJ_DATA一通修改但程序实际上链接的是另一个PROJ库用的也是那份库的默认数据路径环境变量根本没被读取自然修不好。方法一动态库查看。Linux下用ldd看程序链接的PROJ库ldd your_program | grep proj能看到类似libproj.so.25 /lib/x86_64-linux-gnu/libproj.so.25这样的输出记下库路径。如果是Python环境import pyproj print(pyproj.proj_version_str) print(pyproj.datadir.get_data_dir())这会告诉你pyproj使用的是哪个版本、期望哪个数据目录。方法二源码或编译配置。如果你是使用CMake构建的C项目查看CMakeCache.txt里的PROJ_LIBRARY和PROJ_INCLUDE_DIR变量grep PROJ CMakeCache.txt例如PROJ_LIBRARY:FILEPATH/usr/lib/x86_64-linux-gnu/libproj.so PROJ_INCLUDE_DIR:PATH/usr/include方法三运行时打印。在代码中调用PROJ库的API获取数据库路径#include proj.h PJ_CONTEXT* ctx proj_context_create(); const char* db_path proj_context_get_database_path(ctx, nullptr); printf(Database path: %s\n, db_path ? db_path : NULL); proj_context_destroy(ctx);如果打印出来是NULL或NULLPROJ返回的是nullptr时可能显示不同说明数据库根本没找到如果打印出路径但你不确定文件是否存在再手动ls确认。在Python中同理from pyproj.datadir import get_data_dir print(get_data_dir()) # 如果返回空或报异常说明数据目录不可用结合这两步你就能确定“程序用哪个PROJ库”和“PROJ库期望的数据库路径”接下来按图索骥修复即可。3.3 第三步按调用场景对症下药这里我把最常见的几种调用场景和修复方案分别列出来你可以直接对着自己的情况操作。场景AC/C程序直接链接系统PROJ库这种情况最简单。确认系统PROJ库的版本和数据库路径后设置环境变量export PROJ_DATA/usr/local/share/proj # 根据实际路径调整或者更彻底一点如果库和数据库的路径都不对直接用包管理器重装sudo apt install --reinstall proj-bin libproj-dev proj-data重装后检查projinfo EPSG:4326能正常输出就说明基础环境OK了。然后重新编译运行你的程序。场景BQt/C项目调用PROJ结合热搜词QGIS或基于Qt开发的GIS工具中如果直接调用PROJ库常见问题是你自己的程序使用Qt Creator加载环境变量时没有继承终端里设置的PROJ_DATA。Qt Creator的“Projects - Run - Environment”设置里会维护一份独立的环境变量覆盖默认从系统环境继承但如果之前手动改过可能会覆盖或删除某些变量。解决办法打开Qt Creator进入“Projects - Run”在“Environment”一栏添加PROJ_DATA你的proj.db所在目录“Batch size”之类的保持默认即可。记得删除掉PROJ_LIB这类旧变量以免两者冲突。对于用CMake构建的Qt项目还可以在CMakeLists.txt中把数据库路径以编译宏的方式传入程序启动时自己设置环境变量#ifdef Q_OS_WIN _putenv_s(PROJ_DATA, D:/libs/proj/share/proj); #else setenv(PROJ_DATA, /usr/local/share/proj, 1); #endif这种方式的好处是程序启动时强制设置不依赖外部环境配置部署到别的机器上也不会因环境变量缺失而崩溃。缺点是不够灵活如果数据库路径变了需要改代码重新编译。我个人在交付给客户的可执行程序里更倾向于在程序启动时根据可执行文件所在目录自动推导PROJ数据路径比如QDir appDir(QCoreApplication::applicationDirPath()); QString projDataDir appDir.filePath(data/proj); qputenv(PROJ_DATA, projDataDir.toUtf8());只要发布时确保data/proj/proj.db随程序一起分发即可。这种部署方式对最终用户最友好——不用配环境变量开箱即用。场景CPython里用pyproj/GDAL如果你的Python代码报错建议按以下顺序排查先看版本搭配python -c import pyproj; print(pyproj.proj_version_str); print(pyproj.datadir.get_data_dir())如果pyproj.datadir.get_data_dir()能返回路径且该目录下确实有proj.db那说明pyproj自己正常。此时如果代码还报错可能是你的Python环境中存在多个GDAL/OGR版本冲突。如果get_data_dir()返回不存在或空的路径最简单的修复方式是强制重置数据目录from pyproj.datadir import set_data_dir set_data_dir(/path/to/your/proj_db_dir)但这属于运行时诊断手段不适合写进生产代码。更好的方式是正确设置环境变量后重启解释器。用GDAL的时候要注意GDAL 3.0之后捆绑了PROJ支持如果GDAL的PROJ版本与系统的PROJ不一致推荐做法是让GDAL和PROJ都从conda-forge安装保持版本匹配conda install -c conda-forge gdal pyprojconda会自动帮你解决PROJ版本依赖并在环境内放置正确的proj.db。场景DJava调用GDAL/PROJ结合jdk环境变量热搜Java项目通过GDAL-JNI或JavaCPP绑定调用PROJ时除了PROJ自身的问题还有一个典型的坑Java应用启动时的工作目录、用户目录或环境变量可能和命令行不同。比如你用java -jar启动Java进程的环境变量继承自启动它的shell但如果是从Windows服务启动或者IDE里的Application配置启动可能继承的是系统环境变量而非你当前终端的临时变量。解决建议export PROJ_DATA/usr/local/share/proj java -Djava.library.path/path/to/gdal -jar yourapp.jar或者更稳妥地在Java代码里用System.setProperty设置System.setProperty(PROJ_DATA, /usr/local/share/proj);但注意System.setProperty设置的是Java系统属性不一定会被JNI原生代码读取因为原生层读取的是进程级环境变量。正确做法是用ProcessBuilder启动子进程时手动传入环境变量或者在Java启动前通过shell设置环境变量。这个坑我踩过不止一次最后都是靠“启动脚本里先export再java -jar”解决。3.4 路径修复的终极方案在代码里动态设置既然环境变量的口令容易踩空很多成熟的跨平台解决方案会选择在程序启动早期、加载PROJ相关初始化代码之前就通过代码强制设置环境变量。CWindows#include cstdlib _putenv_s(PROJ_DATA, D:\\libs\\proj\\share\\proj);CLinux/macOS#include cstdlib setenv(PROJ_DATA, /usr/local/share/proj, 1);Pythonimport os os.environ[PROJ_DATA] /usr/local/share/projJava启动脚本中设置:export PROJ_DATA/usr/local/share/proj java -jar app.jar这个方案的优点是“不依赖外部配置、代码即配置”特别适合需要在用户机器上直接运行的桌面应用或工具软件。缺点是硬编码路径带来的移植性问题所以更推荐相对路径推导比如相对于可执行文件所在目录或者程序安装目录。我实际交付的Qt GIS客户端里就采用了“程序启动时检测可执行文件目录 → 检查是否存在data/proj/proj.db→ 存在则写入PROJ_DATA环境变量 → 再初始化PROJ上下文”这一套逻辑。部署时只需要把整个程序目录复制到目标机器即可不需要任何手工配置环境变量的步骤客户的运维同学对此赞不绝口。4. 常见问题排查与避坑实测处理过太多PROJ环境变量相关的报错之后我把高频问题和对应的排查方法整理成一个速查表方便你遇到问题时快速对照。这个表里的每一项都是我在实际项目和客户现场踩过的真实坑。报错现象可能原因排查与解决方法设置PROJ_DATA后仍然报Cannot find proj.db环境变量设置后终端/IDE未重启进程没读到新变量重新打开终端或重启IDE用echo $PROJ_DATALinux/macOS或echo %PROJ_DATA%Windows确认当前值程序能跑通但转换结果和预期不符加载了错误版本的proj.db比如conda环境和系统环境混用确认程序实际使用哪个PROJ库用ldd或Python信息打印统一数据源尽可能让数据库版本与库版本一致不同程序一个报错一个正常多个PROJ实例并存路径配置各管各的分别确认不同进程的PROJ库路径和数据路径建议统一环境变量或把各自的数据库与库放进同一套目录conda环境内pip install pyproj后报错pip安装的pyproj与conda的PROJ库版本不匹配统一用conda install -c conda-forge pyproj不混用pip和conda装同一套库Docker容器里启动程序报错镜像内没有设置PROJ_DATA或容器内proj.db位置偏移在Dockerfile或运行时通过-e PROJ_DATA...显式指定先docker exec进入容器用find / -name proj.db确认路径编译时指定了PROJ目录运行时却找不到编译链接的PROJ库路径和运行时动态链接路径不一致用ldd确认实际的共享库加载路径Linux下可用LD_LIBRARY_PATH辅助指定Windows下注意运行目录是否有对应的proj.dllWindows的Qt程序在IDE中正常独立运行报错IDE继承了完整环境变量独立运行时缺少在程序启动代码里动态设置环境变量或者把proj.db和动态库放在程序所在目录并按相对路径查找设置了PROJ_LIB但无效PROJ 8.1对PROJ_LIB的支持已弱化优先读取PROJ_DATA改用PROJ_DATA并保证目录内直接包含proj.db4.1 边缘情况proj.db文件存在但报错“Cannot find”你以为文件在就万事大吉了这里有一个隐藏很深的坑proj.db文件存在但权限不对或者文件损坏SQLite无法打开。Linux下如果proj.db的权限为600而程序以其他用户身份运行就只报“Cannot find proj.db”而不直接说“Permission denied”。此时用ls -l检查文件权限确保程序运行用户有读权限。还有一种情况是下载的proj.db文件不完整比如你从网上下载了一个1GB的数据包但解压中断proj.db只有几十KBPROJ打不开数据库时可能报错为“Cannot find”或者“SQLite error”。排查方法很简单python3 -c import sqlite3; connsqlite3.connect(/path/proj.db); print(conn.execute(SELECT count(*) FROM proj).fetchone())能输出类似(4600,)的数字就说明数据库文件正常可用如果直接抛异常文件损坏重新下载或重装对应的PROJ数据包。4.2 依赖链里的“隐形PROJ”很多时候你写的代码并没有直接调用PROJ但报错信息还是出现了。这是因为GDAL是PROJ的上游依赖库OGR进行坐标转换时会默认初始化PROJ上下文。所以即使你的程序只是读了个Shapefile只要它链接了GDAL而GDAL编译时选择了动态加载PROJ那么PROJ环境问题一样能顺藤摸瓜找上来。这种情况下排查建议有一个非常实用的技巧用strace看进程实际尝试打开哪些路径strace -f -e openat,access your_program 21 | grep proj.dbmacOS下用sudo dtruss -f -t open your_program 21 | grep proj.db需要root权限。这个方法能直接看到程序在运行时依次尝试了哪些目录下的proj.db不用猜一目了然。Windows下可以用Process MonitorSysinternals工具过滤Path contains proj.db同样能追踪实际访问路径。这是排查“环境变量设置了但程序没走那条路径”这类问题的终极武器我每次排查复杂PROJ问题都会先用它确认路径访问情况。4.3 离线部署场景的完整移植方案如果你需要把基于PROJ的应用部署到离线环境或者分发给客户可以按下面这套流程来避免客户被空白的Cannot find proj.db劝退准备一套与目标系统匹配的PROJ库和proj.db把动态库Linux的.so、Windows的.dll、数据文件proj.db和可执行程序放在同一个目录结构下在程序启动代码中根据可执行文件路径推导PROJ数据目录并设置环境变量打包发布时附带启动脚本脚本里显式设置LD_LIBRARY_PATHLinux或PATHWindows指向捆绑的PROJ库目录。一个Linux部署的脚本示例#!/bin/bash APP_DIR$(cd $(dirname ${BASH_SOURCE[0]}) pwd) export LD_LIBRARY_PATH$APP_DIR/lib:$LD_LIBRARY_PATH export PROJ_DATA$APP_DIR/share/proj exec $APP_DIR/bin/your_app $Windows发布时程序里动态设置环境变量的代码qputenv(PATH, appDir \\bin; qgetenv(PATH)); qputenv(PROJ_DATA, appDir \\share\\proj);这样分发给客户后无论是双击EXE还是通过快捷方式启动都能可靠地找到proj.db也不会因为客户机器上装了别的PROJ版本而出现版本冲突。5. 结语与个人实操体会把这一整套走下来你会发现Cannot find proj.db这个报错本身并不复杂真正麻烦的是它隐藏在不同调用链、不同环境变量和不同版本策略的组合之下。写到最后我分享几点自己长期处理这类问题的经验和心得。先说第一点不要盲目重装。遇到PROJ报错我见过太多人一上来就卸载重装PROJ、重装GDAL、重装QGIS折腾一圈回来问题还在因为根因是环境变量或路径配置问题重装并不会自动写入环境变量。正确的顺序永远是“先定位文件→确认库版本→再配置变量→最后验证”。第二点版本一致性是最容易忽略的隐性成本。PROJ 7和PROJ 9的proj.db结构差异不小如果你系统里混装了不同版本哪怕路径配对了也可能因为数据库结构与库代码版本不匹配而出一些无法解释的怪问题。尽量保证全链路统一PROJ版本。在conda环境里坚持conda-forge分发在系统级使用官方包管理器或官方构建脚本。第三点给运维留一条后路。环境变量配置虽然简单直接但对最终用户的维护成本其实不低。如果你的软件是给别人用的务必提供“代码自动配置/部署脚本/自包含目录”中的至少一个方案千万别把环境变量配置作为唯一选项写进技术文档然后在客户现场被各种不可控的机器环境折腾到怀疑人生。最后再分享一个小技巧算是我自己长期实践下来最顺手的一个习惯在任何涉及PROJ/GDAL的项目里都写一段很简短的启动自检代码检查proj.db是否能正常打开并在启动日志里打印数据库版本路径信息。这个自检代码不超过20行但在上线初期和后续的客户现场问题排查中能帮你省下至少80%的沟通成本——因为当对方说“我报错了”的时候你手里已经有了第一手的现场环境信息而不是靠猜。希望这篇基于真实踩坑经验整理的内容能让你下次见到Cannot find proj.db时不再像当初的我一样手忙脚乱。