☰
Windows下OSG 3.6.5+OSGEarth 3rdParty编译避坑
2026/10/28 19:15:25 网站建设 项目流程

简介:面向OSG3.6.5与OSGEarth2.10开发者的VS2019 64位预编译三方库,主要解决Windows下三维场景项目依赖编译耗时、版本匹配困难的问题,适合具备C++基础、希望快速搭建可运行环境的学习者与工程人员。压缩包共2000个文件,约137.76MB,涵盖大量.h头文件、.lib库、.dll动态库,以及.cmake配置、.c/.cpp源码、.hpp/.inl模板实现、.proto接口定义和html文档等,覆盖开发、链接与运行所需的主要组成。已有626人学习下载。接入VS2019工程后可借助现成头文件、库文件与CMake配置减少逐项编译依赖的折腾,也便于排查路径、链接和运行库缺失问题,提升OSG/OSGEarth项目的起步效率。

1. 预编译 3rdParty 摆在眼前,为什么还是编不过

在 VS2019 上从源码编 OSG 3.6.5 和 OSGEarth,真正卡人的往往不是 cmake 那几行命令,而是那份 3rdParty 预编译包。我见过一位开发者把包解压到D:\3rdParty,CMake 里路径也填了,配置阶段照样弹出Could NOT find ZLIB、Could NOT find CURL,换了三份包都没用,最后发现是路径指到了3rdParty\lib这一层,而不是包根目录。OSG 3.6.5 加 OSGEarth 这套组合在三维仿真、地形渲染类项目里出现频率很高,3rdParty 里装着 zlib、libpng、libjpeg、curl、GDAL、protobuf 这些底层依赖,只要有一处版本、位宽或者运行库对不上,编译能过、运行照样崩。这篇记录面向要在 Windows 上自己出二进制的人,从解压位置一路写到跑通第一个地球。

2. 环境对齐:VS2019 工具集、OSG 3.6.5 与 3rdParty 的位宽核对

装这套东西最容易犯的错,是把它当成「解压完就能编」的绿色包。3rdParty 里的.lib是二进制产物,它绑定编译器工具集、目标架构和运行库三件事,任何一项和你的工程不一致,链接期就会以各种看不懂的符号错误回敬你。所以在敲第一条 cmake 之前,先把下面三件事逐个确认,比事后查 LNK2019 省太多时间。

2.1 工具集与目标架构先定死

VS2019 对应的工具集是 v142,生成器名写"Visual Studio 16 2019",-A x64指定 64 位。这三个信息必须与 3rdParty 包名上标注的一致——包名里带vc141就是给 VS2017 的 v141 用的,带vc142才是 VS2019。用 v141 的库去链 v142 的工程,多数情况下能过,但一旦碰上 C++ 标准库内部结构变化(比如std::string的布局),运行期就是随机崩溃,这种问题查起来极其费劲。

# 先确认本机安装的工具集,输出里要能看到 14.2x 开头的版本号 "C:/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" -latest -products * \ -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 \ -property installationVersion # 确认 CMake 版本,3.15 以上对 VS2019 的多配置支持比较完整 cmake --version

第一条命令的作用是确认 v142 工具集确实装了,只装 VS2019 的壳不装 C++ 工作负载是很常见的情况,CMake 配置时报「找不到 C/C++ 编译器」多半就是这个原因。第二条确认 CMake 版本,低于 3.15 时对-A x64和多配置生成器的处理会有差异,我一般直接用 3.20 以上的版本,省得在生成器参数上纠结。

目标架构只选 x64。32 位在这套依赖上没有任何优势,而且 3rdParty 包通常只提供一套位宽的产物,混用会直接触发LNK1112: module machine type 'x64' conflicts with target machine type 'x86'。

2.2 3rdParty 解压到哪、里面到底长什么样

解压位置本身不敏感,但层级极其敏感。CMake 找依赖时是按「根目录下的 include / lib / bin」这个约定去拼路径的,你多套一层文件夹,它就找不到。我一般固定放在D:\OSG\3rdParty,这样和源码、构建、安装目录平级,后面所有路径都能写成可预测的绝对路径。

解压后先别急着配 CMake,把目录结构看一眼:

路径内容用途
3rdParty\includezlib.h、png.h、curl.h、gdal 等头文件编译期包含
3rdParty\lib\x64*.lib导入库,Debug 版常带d后缀链接期使用
3rdParty\bin\x64*.dll运行时库运行期加载
3rdParty\lib直属少数包会把 lib 平铺在这一层需要按实际结构判断
# 解压后先扫一眼关键依赖在不在,别等 CMake 报错再回头翻 ls D:/OSG/3rdParty/include | grep -Ei "zlib|png|jpeg|curl|gdal|protobuf" ls D:/OSG/3rdParty/lib/x64 | head -30 ls D:/OSG/3rdParty/bin/x64 | grep -Ei "zlib|png|curl|gdal"

这两条ls的意义在于提前确认「头文件、导入库、动态库」三件套齐全。有些包为了瘦身只给 Release 版 lib,Debug 版缺失;有些包 lib 平铺在lib下而不是lib\x64。这两种结构差异会直接决定后面 CMake 变量怎么填。如果lib\x64不存在而lib下直接是.lib,那ACTUAL_3RDPARTY_DIR仍然指向D:/OSG/3rdParty,但需要额外确认 OSG 的查找逻辑能否命中,实在不行就手工建一层x64目录把 lib 挪进去。

注意:不要为了省磁盘把 3rdParty 放到带空格或中文的路径下。OSG 的部分 CMake 脚本对路径里的空格处理不干净,配置阶段可能悄悄丢掉某个依赖而不报错。

2.3 四类目录的路径规划与命名约定

从这一节开始,所有路径都按下面这张表来,后面不再重复解释:

角色路径说明
3rdPartyD:\OSG\3rdParty预编译依赖根目录
OSG 源码D:\OSG\src\OpenSceneGraph-3.6.5解压出的源码树
OSG 构建D:\OSG\build\osg-3.6.5CMake 生成物,可整个删掉重来
OSG 安装D:\OSG\installINSTALL目标输出,最终被工程引用
OSGEarth 源码D:\OSG\src\osgearth与 OSG 平级
OSGEarth 构建D:\OSG\build\osgearth同上

源码目录和构建目录分离这件事,看起来是老生常谈,但在 OSG 上尤其重要:它的 CMake 脚本会在源码目录里生成一些中间文件,一旦你试过在源码目录里直接 cmake,后面想换参数重来就得重新解压一份源码。构建目录独立之后,改错参数只需要删掉build\osg-3.6.5重跑一遍,源码一点不动。

安装目录单独拎出来也有讲究。OSG 和 OSGEarth 装到同一个前缀下(D:\OSG\install),头文件、lib、dll 天然合并,OSGEarth 找 OSG 时只要指向这一个目录即可,不用维护两条CMAKE_PREFIX_PATH。代价是两个项目的文件名不能冲突——实际不会,OSG 的库是osg*.lib,OSGEarth 是osgEarth*.lib。

3. CMake 配置 OSG 3.6.5:把预编译 3rdParty 挂进构建系统

OSG 的 CMake 脚本对 3rdParty 的查找逻辑是「先看你指定的路径,找不到再退回系统路径」,所以把ACTUAL_3RDPARTY_DIR指对,后面一大半依赖都能自动命中。这一章的重点不是把所有变量都设一遍,而是搞清哪几个变量真正决定成败,其余保持默认。

3.1 源码、构建、安装三个目录分开

先建目录,再确认源码树顶层有CMakeLists.txt。OSG 的源码包解压后有时会多套一层同名文件夹,如果D:\OSG\src\OpenSceneGraph-3.6.5下面还是一个OpenSceneGraph-3.6.5,那-S参数就要再往下走一层,否则 CMake 会报找不到CMakeLists.txt。

mkdir -p D:/OSG/build/osg-3.6.5 D:/OSG/install # 确认源码树顶层就是 CMakeLists.txt,不是再套一层 ls D:/OSG/src/OpenSceneGraph-3.6.5/CMakeLists.txt ls D:/OSG/src/OpenSceneGraph-3.6.5/src/osg/CMakeLists.txt

第二条ls是确认源码树完整。有些精简包会把src下的子目录删掉一部分,配置阶段不一定报错,等到编译到某个 target 才炸。提前看一眼成本很低。

3.2 关键 CMake 变量逐条过

下面这条是完整可抄的配置命令,续行符是 bash 风格,在 cmd 里换成^,PowerShell 里换成反引号:

cmake -S D:/OSG/src/OpenSceneGraph-3.6.5 -B D:/OSG/build/osg-3.6.5 \ -G "Visual Studio 16 2019" -A x64 \ -DACTUAL_3RDPARTY_DIR=D:/OSG/3rdParty \ -DCMAKE_INSTALL_PREFIX=D:/OSG/install \ -DBUILD_OSG_EXAMPLES=OFF \ -DBUILD_OSG_APPLICATIONS=ON \ -DBUILD_OSG_PLUGINS=ON \ -DDYNAMIC_OSG=ON \ -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" \ -DCMAKE_DEBUG_POSTFIX=d

逐条说明,这几个是最值得花时间理解的:

ACTUAL_3RDPARTY_DIR是整个配置的核心。它必须指向 3rdParty 的根目录,也就是include、lib、bin的父目录。指到lib或lib/x64都会导致查找失败,这是最高频的翻车点。

CMAKE_INSTALL_PREFIX决定INSTALL目标把产物吐到哪。设成D:/OSG/install之后,编译完执行 INSTALL,头文件进include、库进lib、dll 进bin,OSGEarth 后面直接引用这个前缀。

BUILD_OSG_EXAMPLES=OFF是省时间的关键。examples 有几百个 target,全编一遍能多花二十分钟以上,而且和你的实际使用完全无关。BUILD_OSG_APPLICATIONS=ON保留,因为osgviewer、osgversion这些命令行工具在 applications 里,后面验证要用。

DYNAMIC_OSG=ON生成动态库。选动态的理由很实际:3rdParty 里给的是动态导入库(.lib加.dll的组合),你编静态 OSG 就得去链静态版的第三方库,而包里往往没提供。动态链接是这套预编译依赖下的默认路线。

CMAKE_MSVC_RUNTIME_LIBRARY设成MultiThreadedDLL,也就是/MD(Release)和/MDd(Debug)。3rdParty 里的库基本都是按/MD编的,如果你的工程用了/MT,链接期直接LNK2038: mismatch detected for 'RuntimeLibrary'。这个变量在 CMake 3.15 以上才被 OSG 正确识别,老版本需要在CMAKE_CXX_FLAGS里手工加。

CMAKE_DEBUG_POSTFIX=d让 Debug 版库带d后缀(osgd.lib),和 3rdParty 里zlibd.lib这类命名规则保持一致,避免 Debug 配置下找不到库。

提示:如果配置输出里出现Could NOT find ZLIB,先别怀疑包损坏,把ACTUAL_3RDPARTY_DIR的值打印出来看一眼,九成是层级多了一层或者少了一层。

3.3 生成 VS2019 工程并做首轮自检

命令跑完别只看最后一行有没有Configuring done,中间那一大段found / not found列表才是关键。

cmake -S D:/OSG/src/OpenSceneGraph-3.6.5 -B D:/OSG/build/osg-3.6.5 \ -G "Visual Studio 16 2019" -A x64 \ -DACTUAL_3RDPARTY_DIR=D:/OSG/3rdParty \ -DCMAKE_INSTALL_PREFIX=D:/OSG/install \ -DBUILD_OSG_EXAMPLES=OFF \ -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" 2>&1 | tee D:/OSG/build/osg-config.log # 关注这几个依赖的查找结果,缺一个后面就可能编不过 grep -Ei "found (zlib|libpng|libjpeg|curl|gdal|freetype)" D:/OSG/build/osg-config.log grep -Ei "could not find" D:/OSG/build/osg-config.log

2>&1 | tee的作用是把 CMake 输出同时留在终端和日志文件里,配置失败时不用靠滚屏回忆。第一条 grep 确认核心依赖命中,第二条把所有未找到的列出来。

出现Could NOT find时的判断顺序是:先看这个依赖在 3rdParty 里到底有没有(回到 2.2 的ls结果);再看是不是只有 Release 版没有 Debug 版;最后才考虑包版本和 OSG 3.6.5 是否匹配。OSG 3.6.5 对 zlib、libpng 的版本要求不严,但 curl 和 GDAL 的 API 变动较大,如果 3rdParty 是从很老的包里翻出来的,可能配置能过、编译报「未声明的标识符」。

FFmpeg 是可选项,找不到不影响编译,只影响视频插件。freetype 影响文字渲染,找不到时osgText会退化,做标注类项目就得补上。这两项在配置输出里是 not found 时可以接受,但心里要有数。

4. 编译安装 OSG 3.6.5 并接上 OSGEarth

配置通过只是拿到了入场券,真正的坑集中在编译和链接阶段。这一章把 OSG 的编译、安装后的目录布局,以及 OSGEarth 怎么接进来串成一条线。

4.1 命令行批量编译 Debug 与 Release

不要打开 VS 点「生成解决方案」。几百个工程、四个配置,手工切来切去容易漏,而且没日志。用 CMake 的--build批量走:

# Release 先来,产物用于最终交付和日常测试 cmake --build D:/OSG/build/osg-3.6.5 --config Release --target INSTALL -- /m:8 # Debug 再来一份,带 d 后缀,方便排查崩溃 cmake --build D:/OSG/build/osg-3.6.5 --config Debug --target INSTALL -- /m:8

--target INSTALL表示编译完自动执行安装,一步到位。/m:8是并行编译的进程数,按 CPU 核心数给,8 核机器给 8、16 核给 16,给太大反而会因为磁盘 IO 打满而变慢。我一般按物理核心数给,不按超线程数。

编译过程中出现失败时,--build默认会继续往下走,最后只报「生成失败」。想快速定位,重跑一次并加上-- -m:1单线程编,第一个报错的 target 就是元凶,比在几千行日志里翻要快得多。

Debug 和 Release 分两次编是必须的,因为 3rdParty 里两套库都有,而 OSG 的 Debug 版需要链zlibd.lib这类带后缀的库。如果只编 Release,后面工程切到 Debug 配置就会找不到osgd.lib。这也解释了为什么CMAKE_DEBUG_POSTFIX要从头设对——它不是可选项,是 Debug/Release 共存的前提。

4.2 install 之后的目录布局与 DLL 搜索路径

INSTALL跑完,去D:\OSG\install看一眼,正常的布局是这样:

ls D:/OSG/install/bin | head # osg160-osg.dll、osgviewer.exe、osgversion.exe ls D:/OSG/install/lib | head # osg.lib、osgd.lib、osgViewer.lib ls D:/OSG/install/include/osg # Node、Group、Viewer 等公共头文件 ls D:/OSG/install/lib/cmake # OSGConfig.cmake 所在位置,供 find_package 使用

注意bin下出现了osg160-osg.dll这种带版本号的命名,这是 OSG 的默认行为,同一台机器上装多个 OSG 版本时可以共存。lib/cmake下的OSGConfig.cmake是 OSGEarth 能找过来的关键,如果这个文件缺失,说明安装步骤没走完或者INSTALL目标没编。

接下来是运行期路径。编译链接阶段靠.lib,运行阶段靠.dll,而 Windows 找 dll 的顺序里,PATH环境变量排在系统目录之后。所以要把 OSG 的 bin 和 3rdParty 的 bin 都塞进去:

# 临时生效,只影响当前终端,调试期用它最安全 export PATH="/d/OSG/install/bin:/d/OSG/3rdParty/bin/x64:$PATH" # 永久生效方式(系统属性里配),用户变量 PATH 追加下面两条 # D:\OSG\install\bin # D:\OSG\3rdParty\bin\x64

只加install\bin是不够的,OSG 的 dll 本身依赖zlib1.dll、libcurl.dll这些,它们躺在 3rdParty 的 bin 下。少加这一条,osgviewer.exe起来就是「找不到 zlib1.dll」,或者更邪门的0xc000007b——那个通常是 32 位和 64 位 dll 混在同一个 PATH 里。

还有一个容易被忽略的变量:OSG_FILE_PATH,指向 OSG 示例数据目录(OpenSceneGraph-Data)。验证时打开cow.osg就靠它。同理OSGEARTH_FILE_PATH指向 osgEarth 的数据目录。这两个变量不影响编译,只影响运行时找模型和贴图。

注意:改完系统 PATH 要重开终端或重启 IDE,已经打开的进程不会重新读取环境变量。VS 尤其顽固,改了 PATH 之后必须关掉重开。

4.3 用同一套 3rdParty 配置 OSGEarth 并编译

OSGEarth 的版本要和 OSG 对得上。OSG 3.6.5 配 OSGEarth 3.x 分支是常见组合,用 2.x 的 OSGEarth 去链 3.6 的 OSG 会遇到OSG_VERSION相关的编译错误。源码包里如果有CMakeLists.txt顶层写死了 OSG 最低版本,先看一眼再动手。

配置命令和 OSG 很像,差异在于它要找的是装好的OSG,不是源码:

cmake -S D:/OSG/src/osgearth -B D:/OSG/build/osgearth \ -G "Visual Studio 16 2019" -A x64 \ -DCMAKE_INSTALL_PREFIX=D:/OSG/install \ -DCMAKE_PREFIX_PATH="D:/OSG/install;D:/OSG/3rdParty" \ -DOSG_DIR=D:/OSG/install/lib/cmake \ -DBUILD_OSGEARTH_EXAMPLES=OFF \ -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL"

CMAKE_PREFIX_PATH里同时放安装目录和 3rdParty 根目录,OSGEarth 找 OSG 靠前者,找 curl、GDAL、protobuf 靠后者。OSG_DIR指向OSGConfig.cmake所在目录,实际路径以你install/lib/cmake下的子目录名为准,有的版本是OSG,有的是osg,配置报错时按提示补全即可。

找不到 GDAL 是 OSGEarth 配置阶段最常见的失败。它检查的不只是库文件,还有头文件版本号,gdal_version.h里的GDAL_VERSION_NUM太老会直接报错。3rdParty 包里如果 GDAL 版本偏旧,要么换包,要么在 CMake 里显式关掉相关驱动(如果这个选项存在)。

配置通过后编译方式完全一样:

cmake --build D:/OSG/build/osgearth --config Release --target INSTALL -- /m:8 cmake --build D:/OSG/build/osgearth --config Debug --target INSTALL -- /m:8

装完之后install\bin下会多出osgearth_viewer.exe,install\lib\osgPlugins-3.6.5下会多出osgdb_earth.dll这类插件。OSGEarth 的插件目录必须和 OSG 的插件目录是同一个(这也是把两者装到同一前缀的原因),否则osgEarth的 earth 文件读取会提示「找不到插件」。

5. 避坑排查:3rdParty 引发的高频翻车记录

下面五条都是我或者身边人真实踩过的,按「现象 → 原因 → 解决」记,遇到时直接对号入座。

5.1 CMake 报找不到 ZLIB,但包里明明有

现象:配置阶段输出Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR),去D:\OSG\3rdParty\lib\x64一看zlib.lib躺得好好的。

原因:ACTUAL_3RDPARTY_DIR指错了层级。指到D:/OSG/3rdParty/lib或D:/OSG/3rdParty/lib/x64时,OSG 的查找脚本会去拼lib/include和lib/lib这种不存在的路径。

解决:把变量改回包的根目录D:/OSG/3rdParty,同时确认include、lib、bin是它的直接子目录。清空构建目录重新配置,CMake 有缓存,直接重跑不会覆盖旧值。

5.2 osgviewer 双击就报找不到 zlib1.dll

现象:编译一切正常,命令行跑osgviewer.exe cow.osg弹窗提示缺少zlib1.dll,或者直接以0xc000007b退出。

原因:PATH里只有install\bin,没有3rdParty\bin\x64。0xc000007b则是 PATH 里混进了 32 位 dll,加载器位宽不匹配。

解决:把D:\OSG\3rdParty\bin\x64加进 PATH,并检查这个目录下所有 dll 是不是都是 64 位。用dumpbin /headers zlib1.dll | findstr machine可以确认,输出8664是 64 位,14C是 32 位。

5.3 LNK2038 RuntimeLibrary 不匹配

现象:链接阶段大量LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease'。

原因:OSG 被编成了/MT静态运行库,而 3rdParty 是/MD。或者反过来,你的业务工程是/MT,却去链 OSG 的/MD库。

解决:统一到/MD。确认配置命令里CMAKE_MSVC_RUNTIME_LIBRARY是MultiThreadedDLL,并且业务工程的「C/C++ → 代码生成 → 运行库」也改成「多线程 DLL (/MD)」。不要试图用/NODEFAULTLIB强压,那只是把问题推到运行期。

5.4 OSGEarth 配置时报找不到 OSG

现象:Could NOT find OSG,但D:\OSG\install下头文件和 lib 都在。

原因:OSG_DIR没设,或者指向了install根目录而不是OSGConfig.cmake所在的lib/cmake子目录。

解决:先find D:/OSG/install -name "OSGConfig.cmake"定位实际路径,再把OSG_DIR指到它所在的目录。同时确认install下有osg.lib(Release)和osgd.lib(Debug),只有一套的话,另一套配置编译时还是会失败。

5.5 Debug 配置链接时找不到 xxxd.lib

现象:Release 编译一切正常,切到 Debug 就报无法打开输入文件 zlibd.lib之类。

原因:3rdParty 包里只提供了 Release 版库,没有 Debug 版;或者CMAKE_DEBUG_POSTFIX没设,OSG 去找zlib.lib而 3rdParty 提供的却叫zlibd.lib,两边命名规则对不上。

解决:先ls D:/OSG/3rdParty/lib/x64 | grep -i "d\.lib"确认 Debug 版库到底有没有。没有就别硬编 Debug,日常开发用 RelWithDebInfo 也能拿到调试符号。有的话,把CMAKE_DEBUG_POSTFIX和 3rdParty 的命名规范对齐,必要时在 CMake 里显式指定ZLIB_LIBRARY_DEBUG的完整路径。

6. 装完之后怎么验证:三步确认 OSG 和 OSGEarth 真的跑通

编完不算完,很多人到这一步就以为收工了,结果业务工程一接就出事。验证要分层做,从「库本身能跑」到「能被别的工程找到」,再到「渲染真的出画面」,最后一步才最能说明问题。

第一步验版本和链接健康度。命令行直接跑,不依赖任何模型文件:

osgversion # 期望输出:OpenSceneGraph Library 3.6.5 osgversion --version # 顺带确认编译配置,输出里能看到 Compiler 和 GL_VERSION 相关信息

osgversion能输出就说明 dll 加载链是通的,从zlib1.dll到osg160-osg.dll全都能找到。这一步过不了,别往下走,回去查 PATH。

第二步验渲染管线。用 OSG 示例数据里的cow.osg:

export OSG_FILE_PATH="D:/OSG/data/OpenSceneGraph-Data" osgviewer cow.osg # 出现一头牛,鼠标能转,说明 OpenGL 上下文、插件加载、模型读取全通

窗口出来但一片黑,通常是显卡驱动或者 OpenGL 版本问题;弹窗提示Error no plugin found则是插件目录没配对,检查install\lib\osgPlugins-3.6.5是否存在且 PATH 里有install\bin。

第三步验 OSGEarth。用 osgEarth 源码 tests 目录下的任意.earth文件:

export OSGEARTH_FILE_PATH="D:/OSG/src/osgearth/tests" osgearth_viewer simple.earth # 能加载出地形或影像,说明 osgdb_earth 插件和 GDAL 都正常

如果前两步都过了、这一步报插件找不到,问题一定在插件目录上——osgEarth的插件和 OSG 的插件必须在同一个osgPlugins-3.6.5目录下,装到两个不同前缀是最常见的错。

最后补一步「外部工程能不能找到」,这是业务接入前的最后关口。新建一个空目录,写个最小CMakeLists.txt:

cmake_minimum_required(VERSION 3.15) project(osg_probe CXX) # 用与 OSGEarth 相同的方式找 OSG,模拟真实工程 find_package(OSG REQUIRED) add_executable(probe main.cpp) target_link_libraries(probe PRIVATE osg::osg)

配置时传-DCMAKE_PREFIX_PATH=D:/OSG/install,能过就说明OSGConfig.cmake的导出内容是健康的。这一步比跑osgviewer更有价值,因为它验证的是「别人拿你的安装目录能不能用」,而不是「你自己机器上能不能跑」。

从那以后我每次装完这套环境,都会强制走一遍这三步加一个最小工程,缺一步不开工。踩过的坑告诉我,编译通过只是说明语法对了,能不能跑、能不能被别人用,是两件不同的事。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询