简介:这是一份在VS2005环境下完成编译打包的podofo0.9.7开源PDF读写库资源包,专门面向具备一定C++开发基础的程序员,解决在较旧的Visual Studio 2005环境中直接编译集成PDF解析与PDF生成功能较为困难的问题。整个资源包共1382个文件、约42.38MB,其中以372个h头文件、327个c源文件、102个cpp文件及279个obj编译产物为核心内容,另有vcproj工程文件、makefile、configure配置脚本等构建辅助文件,下载后可直接打开VS工程完成编译并调用。包内已集成编译好的freetype、libjpeg、libpng、libtiff、zlib等第三方依赖库,编译成lib静态库形式,便于开发时链接,减少逐个配置外部依赖的麻烦;同时保留openssl文档加密相关宏,启用PODOFO_HAVE_OPENSSL后需额外添加两个dll并连接对应lib库,两个依赖Linux的用例默认处于禁用状态。目前已有571人学习或下载过,适合需要在VS2005中集成PDF读写能力的C++开发者参考与复用。
1. VS2005版本编译podofo 0.9.7开源PDF读写lib库:老编译器能不能把这事干成
VS2005版本编译podofo 0.9.7开源PDF读写lib库,翻译成现场的话就是:在一台装着Visual Studio 2005的机器上,把podofo 0.9.7的C++源码编成一个能被老程序链接的PDF读写库。这个组合通常出现在两类项目里:一类是维护快二十年的老系统,部署环境还是Windows XP,新工具链编出来的库不敢往上扔;另一类是工具链早就冻结,客户却要求新增PDF导出和解析。podofo 0.9.7本身还在C++98的框架内,理论上与VS2005没有代沟,但它默认挂着一串第三方依赖:zlib、libpng、libjpeg、freetype、OpenSSL。真正卡人的不是podofo,而是这些依赖的新版本早就把VS2005丢下了。所以这个标题的本质,是把老编译器、中等老项目、老依赖库重新拼到同一张桌子上的工程。
2. 开源podofo 0.9.7的底座分析:源码结构、依赖开关与工具链准备
2.1 podofo 0.9.7的源码结构,以及“lib库”里到底有什么
podofo 0.9.7的源码包解开之后,常见布局是cmake、lib、include、src、tools这几个目录。src下面按职责拆成base、doc、graphics、fonts等子目录,编译后合并成一份核心库。include目录放公共头文件,外部程序一般用#include <podofo/podofo.h>来引用整条API。tools里是几个命令行小工具,比如podofocrop、podofomerge,它们不是核心库的一部分,但用来手动验证库功能非常方便。
“lib库”这个词在老项目里有两个意思:一个是指静态库文件本身,比如podofo.lib;另一个是指DLL的导入库。podofo 0.9.7的CMake构建能同时出静态和动态两种形态:静态版本适合直接塞进exe,动态版本则是一个podofo.dll加一个导入库。对VS2005时代的老程序来说,我一般建议编静态版本,理由很直接:现场机器上未必有合适的运行时配套,少带一个DLL,就少一类排查工作。
核心库虽然只是一个文件,但它背后对应的是PDF的整个对象模型。podofo把PDF拆成对象树,PdfDocument对应整个文档,PdfMemDocument负责从磁盘加载进内存,PdfPage和PdfPageCollection管理页面,PdfPainter在页面上画文字和图形。理解这个分层再编译,后面用起来会顺很多。库本身不区分“读”和“写”,它同时具备解析和生成能力,你调哪个接口,它就干哪件事。
2.2 依赖库逐个盘一遍:哪个必须编,哪个可以关
podofo 0.9.7不是无依赖的。CMake配置里开着多个features开关,每一项对应一个PDF特性。很多第一次上手的人会在这一步盲目把开关全部打开,然后在编译期被OpenSSL折腾到怀疑人生。我习惯先关掉用不上的,再把必须用的逐个编好。
| 依赖库 | 对应PDF功能 | 能不能关 | 关掉之后的代价 |
|---|---|---|---|
| zlib | FlateDecode压缩/解压 | 不能关 | PDF文本流和多数内容流无法处理 |
| libpng | 透明通道PNG图片读写 | 能关 | 带alpha通道的图片处理不了,普通PNG也可能受影响 |
| libjpeg | JPEG图片解码/编码 | 能关 | 扫描件和照片类PDF的图片提取/写入会失败 |
| freetype | TrueType字体解析与字形渲染 | 能关 | 文字定位、字体子集化功能废掉 |
| OpenSSL | AES加密、数字签名与解密 | 能关 | 加密PDF打不开,明文PDF不受影响 |
如果目标只是“生成一个带文字和简单表格的PDF文档”,只保留zlib就够了。如果目标是做PDF解析,比如抽取扫描件里的图片,libjpeg基本逃不掉。如果是做类似打印排版插件的重排版,freetype不要关。OpenSSL在这三类任务里都可以先关掉,等库跑通、功能验证完,再回头补加密支持。
2.3 依赖库版本选择:找“带vc8工程的老版本”,别追新
VS2005对应的MSVC版本是8.0,项目文件后缀是.vcproj。第三方库的新版本几乎都改用了CMake或更新的VS工程,把老工具链筛掉了。常见可用的搭配我列一下:zlib 1.2.11自带contrib/vstudio/vc8目录,打开就是VS2005工程;libpng 1.6.37的projects/vstudio目录下也有vc8;freetype 2.7.1还保留builds/win32/vc8/freetype.sln,之后的版本把老VC工程清理掉了。libjpeg因为本身是纯C库,老版本用nmake加makefile.vc就能编,不用太挑版本。
这一步听起来平淡,其实是整个环节里最容易省时间的:先按“这个库是否还带VC8工程”来选版本,而不是按功能新旧来选。用最新版去跑VS2005,等于是把赛车的配件装到拖拉机上,不是不能改,但改完一轮三轮,时间全搭进去。拿到版本后把版本号记在一张纸上,别靠脑子。我会在工程根目录放一个third-party-versions.txt,写清楚zlib 1.2.11、libpng 1.6.37、freetype 2.7.1、CMake 3.20.x。三个月后重新捡起工程,这行字能帮你省一整天。
2.4 VS2005本体与目录环境的准备
VS2005要先把SP1补丁打上。没有SP1的VS2005,STL和编译器本身有不少已知问题,编podofo时容易出一些莫名其妙的错误,而这些问题在升级SP1之后就不再出现。装完SP1,顺手确认一下编译器版本,保证是MSVC 8.0系列。手头如果是从网上下载的VS2005镜像,记得看是否带了SP1的集成版,没带就先把SP1离线包准备好再开工。
另外,源码目录和CMake构建目录最好放到纯英文路径下,路径里不要有中文、空格和括号。VS2005对中文路径的处理相当玄学,报错时经常不直接说路径问题,而是指向某个头文件找不到或某个奇怪的字符。把项目路径规整好,能省掉很多排查时间。
VS2005的命令行编译环境需要通过vcvars32.bat初始化,路径一般在VC\bin下。编依赖库时如果不开这个窗口,nmake会直接提示找不到cl.exe。我一般会在批处理开头直接调用:
call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat"逻辑说明:这一行把cl、nmake、link等工具加进当前会话的环境变量。参数说明:如果VS2005安装在D盘或者其他目录,引号里的路径要改成实际安装路径;路径含空格时必须加引号,否则call指令解析会断。这个窗口跟普通cmd窗口不一样,没初始化之前直接跑nmake,大概率报的是找不到编译器而不是语法错误。
3. 先把依赖库逐个编出来:从zlib到freetype的构建顺序
3.1 先把zlib编出来:两条路,推荐走vc8工程
zlib 1.2.11源码目录下有个contrib/vstudio/vc8文件夹,里面是完整的VS2005工程。用VS2005打开vc8.sln,在解决方案里找到“zlibstat”项目,它生成静态库。把配置切到Release,直接生成。输出一般是zlibstat.lib,位置在contrib/vstudio/vc8/x86的某个Release子目录里。
如果不想打开IDE,也有一条纯命令行路径:在VS2005命令行窗口里切到zlib源码目录,执行nmake -f win32/Makefile.msc。这个走法不做IDE配置,编出的库文件是zlib.lib,名字更干净。命令如下:
call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" cd /d D:\local\zlib-1.2.11 nmake -f win32/Makefile.msc逻辑说明:第一行初始化VC8命令行环境,第二行进入源码目录,第三行执行zlib自带的Windows构建脚本。参数说明:Makefile.msc是zlib官方维护的nmake版本,会在源码目录下生成zlib.lib;如果不先call vcvars32.bat,nmake会直接报“NMAKE : fatal error U1073”或者找不到cl.exe。如果走了vc8工程路线编出的是zlibstat.lib,后面第4章CMake配置里引用的是zlib.lib,所以把zlibstat.lib复制一份并改名成zlib.lib即可。
3.2 libpng、libjpeg:先保证它们看到的zlib是同一个
libpng 1.6.37同样带VS2005工程,路径在projects/vstudio/vc8。打开后先做两件事:第一,把项目属性里的附加包含目录指向zlib的源码目录;第二,把附加依赖项里的zlib路径指向刚才编好的zlib.lib。这两步漏一步,libpng编译能过,链接测试程序时就会报一堆png函数找不到符号。
libpng输出的一般是libpng.lib。如果版本号被带进文件名,比如libpng16.lib,就复制改名成libpng.lib再放到统一目录。它内部对zlib的版本有要求,头文件版本和库版本必须对得上。常见翻车:zlib头文件是新版,链接的却是旧版库,或者反过来,最后表现为PDF读取时内存越界。
libjpeg老版本是纯C库,直接用nmake编:
cd /d D:\local\libjpeg nmake -f makefile.vc逻辑说明:makefile.vc是libjpeg源码里的老牌Windows构建文件。参数说明:它默认按Release静态库构建,输出jpeg.lib;如果你开了Debug配置,输出会带d后缀。顺便强调一次,链接器对库文件的依赖不会自动帮你找:podofo.lib调用png函数,png.lib调用zlib函数,最终exe链接时三者符号必须同时可见。所以四个库我都放在同一个目录,避免链接器从左到右查找时漏掉某一层。
3.3 freetype:需要的时候再加进来
前面CMake配置里把freetype关了。如果后面要做字体子集化,再补编freetype 2.7.1。具体做法是打开builds/win32/vc8/freetype.sln,编译后生成freetype.lib。freetype对VS2005的兼容度比zlib和libpng低,编译时偶尔报C4819和fopen安全警告,但一般都能扛过去。
freetype的输出目录和podofo的查找路径经常不一致,我一般直接把freetype.lib改名后放到统一libs目录,省得CMake在安装路径里翻箱倒柜。这里不建议为了省时间跳过libpng或libjpeg,除非你明确知道自己的PDF场景不碰图片。等编完库里才发现缺第三步,回头补编的成本比重编一遍还高。
3.4 统一把.lib文件收进同一个目录
依赖库编完,把zlib.lib、libpng.lib、jpeg.lib、freetype.lib全部复制到D:\local\libs目录。这个目录就是后面所有链接操作的唯一查找路径。目录里不要放多个版本的zlib.lib,也不要放调试版和发布版混着的同名库,VS2005的链接器找到第一个符号就停,根本不会提醒你文件重了。
这一步做完,依赖侧的工作就结束了。整个过程看着琐碎,但它是后面CMake配置的硬前提:第4章CMake命令里会直接引用这些.lib的完整路径,路径指向的文件必须在配置那一刻就存在。
4. 用CMake生成VS2005工程:版本选择、配置命令与本体编译
4.1 为什么CMake版本卡住了很多人
podofo 0.9.7推荐用CMake构建,但“CMake”这三个字的范围太大。CMake从3.21版本开始移除了Visual Studio 8 2005生成器,也就是说,拿新版CMake执行-G "Visual Studio 8 2005",CMake会直接报错,连工程都生成不了。这个问题在第5章还会展开。常见可用的稳定版本是CMake 3.16到3.20之间,太老到2.8也能用,但部分依赖查找模块的语法和现代CMake不一样,反而要多改配置。我一般固定用CMake 3.20.x。
打开CMake GUI,在“Where is the source code”指向源码根目录,“Where to build the binaries”指向一个空目录,生成器下拉列表里能看到“Visual Studio 8 2005”的选项,选它。如果下拉列表里根本没有这一项,说明当前CMake版本太老或太新。GUI只是把命令行参数包了一层,本质上和命令行配置等价。
提示:如果cmake --version显示3.21或更高,先别浪费时间找生成器,直接换回3.20.x。
4.2 一条能跑通的CMake配置命令
依赖库就位后,按下面这条命令执行配置。命令是Windows命令行风格,^是换行符,在cmd里照抄即可:
cmake -G "Visual Studio 8 2005" ^ -DCMAKE_INSTALL_PREFIX=D:/local/podofo-install ^ -DCMAKE_BUILD_TYPE=Release ^ -DPODOFO_BUILD_LIB_ONLY=ON ^ -DPODOFO_BUILD_SHARED=OFF ^ -DPODOFO_BUILD_STATIC=ON ^ -DPODOFO_HAVE_OPENSSL=OFF ^ -DPODOFO_HAVE_LIBJPEG=ON ^ -DPODOFO_HAVE_LIBPNG=ON ^ -DPODOFO_HAVE_FREETYPE=OFF ^ -DZLIB_INCLUDE_DIR=D:/local/zlib-1.2.11 ^ -DZLIB_LIBRARY=D:/local/libs/zlib.lib ^ D:/src/podofo-0.9.7逻辑说明:-G指定生成器,CMAKE_INSTALL_PREFIX指定将来安装头文件和库的位置,后面的PODOFO_*开关控制编译范围和依赖特性。参数说明:PODOFO_BUILD_LIB_ONLY=ON表示只编核心库,不编tools和examples,第一次调环境没必要编译一堆命令行小工具;PODOFO_BUILD_SHARED=OFF配合PODOFO_BUILD_STATIC=ON,明确走静态库路线;PODOFO_HAVE_OPENSSL=OFF先跳过加密依赖。ZLIB_INCLUDE_DIR和ZLIB_LIBRARY直接指定zlib的头文件路径和库文件路径,这里没有用ZLIB_ROOT,因为老版本CMake的FindZLIB对非标准目录的识别不稳定,直接给精确路径最省事。
4.3 如果还要开PNG和JPEG,路径怎么给
上面这条命令把freetype关了,但保留了libpng和libjpeg。这两个开关开了之后,CMake会尝试自己找PNG和JPEG库,如果找不到,它不会报错,而是把对应的缓存变量留空,等podofo编译时才发现png.h缺失。所以配置时最好把路径显式补上:
cmake -G "Visual Studio 8 2005" ^ -DPNG_INCLUDE_DIR=D:/local/libpng-1.6.37 ^ -DPNG_LIBRARY=D:/local/libs/libpng.lib ^ -DJPEG_INCLUDE_DIR=D:/local/libjpeg ^ -DJPEG_LIBRARY=D:/local/libs/jpeg.lib ^ -DZLIB_INCLUDE_DIR=D:/local/zlib-1.2.11 ^ -DZLIB_LIBRARY=D:/local/libs/zlib.lib ^ D:/src/podofo-0.9.7逻辑说明:PNG_INCLUDE_DIR要指向libpng的源码目录,因为编译时要用到png.h;PNG_LIBRARY指向前面复制好的libpng.lib。参数说明:这几个变量在CMake 3.20下都能被podofo的find_package链路读取;如果变量名写错,CMake不会立刻报错,但CMakeCache.txt里会出现NOTFOUND,所以配置完必须检查缓存。
4.4 生成之后先检查三样东西再动手编译
生成成功后,构建目录里会出现podofo.sln和一批.vcproj文件。别急着双击打开,先看CMakeCache.txt,确认刚才传的路径都被正确写进去了。重点看两处:一个是ZLIB_LIBRARY,如果显示“ZLIB_LIBRARY-NOTFOUND”,说明路径没被认上,重跑cmake并清除缓存项;另一个是CMAKE_CXX_FLAGS_RELEASE,确认它就是默认的Release编译开关,没有叠加奇怪的宏。
VS2005的工程文件是vcproj格式。双击.sln打开时,如果VS2005提示“版本不符”或“需要转换”,多半是CMake生成的工程带了VS2005不认识的字段。这时候优先怀疑CMake版本太新,换回3.20.x重新生成。不要选“转换”,转换出来的工程会在目录里留下一个.vcxproj,老工程组的人反而看不懂。
另外,构建目录不要放在源码目录里面。podofo的CMake构建会在目录里生成大量中间文件,放进源码目录会把后续用版本管理工具比对源码搞得很痛苦。我习惯建build-vs2005和install两个目录,一个给中间文件,一个给最终产物。将来清理重编,删掉build-vs2005目录就行,源码目录保持干净。
4.5 编podofo本体并拿到podofo.lib
回到CMake生成的build-vs2005目录,打开podofo.sln。IDE里切Release,直接生成整个解决方案。也可以用命令行,日志更直观:
call "C:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat" cd /d D:\build\build-vs2005 devenv.com podofo.sln /build "Release|Win32"逻辑说明:第一行初始化环境,第二行进入构建目录,第三行调用devenv.com编译整个解决方案。参数说明:“Release|Win32”是VS2005里配置名称和平台名称的组合,引号和竖线不能改;devenv.com会把编译日志同步输出到当前控制台,devenv.exe则直接返回,出问题不方便看日志,所以命令行编译推荐用.com。
编完podofo.lib会出现在Release目录下,或者在CMake里指定的输出目录里。拿到它之后,把zlib、libpng、libjpeg各自的.lib文件拷贝到和podofo.lib同一个目录,后续链接主程序时只需要告诉链接器这一个目录。另外提醒,VS2005解决方案默认会生成Debug和Release两套,第一次只盯Release。Debug下的运行库是MTd,第三方依赖库如果只有Release版本,两边的符号和CRT版本对不上,链接会报一堆带debug前缀的符号缺失,容易误判成库没编对。
5. VS2005编译podofo 0.9.7的五个高发坑:现象、原因、解法
这里的五条是从实际踩坑里筛出来的血泪经验,按“现象、原因、解决”的顺序写,每一条都值得在动手前先过一遍。
5.1 CMake版本太新,生成器列表里没有“Visual Studio 8 2005”
现象:执行cmake -G "Visual Studio 8 2005"时,报Could not create named generator,或者在CMake GUI的下拉列表里根本找不到这一项。
原因:CMake 3.21起正式移除了对VS2005生成器的支持。VS2005在CMake里的生成器名就是“Visual Studio 8 2005”,它从CMake家族里退休了。
解决:下载CMake 3.20.x或更早版本,重新执行配置命令。如果公司电脑上装了新版不想换,可以找一台装了老版本CMake的机器生成好工程后整个目录拷过来,但头文件路径和缓存路径会被写死,换机器后要仔细检查CMakeCache.txt。
5.2 链接报一堆unresolved external symbol,符号名以下划线开头
现象:podofo.lib编译正常,但链接自己的测试程序时,报unresolved external symbol _inflate、_png_sig_bytes等一串错误。
原因:podofo.lib内部引用了zlib和libpng的函数,但最终exe链接时没把这些库文件的符号带进来。常见场景是podofo.lib配置时找到了一个zlib版本,链接时却把另一个zlib路径写进工程里;或者libpng编好后的依赖zlib不存在,导致符号悬空。
解决:把所有第三方.lib和podofo.lib放在同一个目录,在属性页的附加依赖项里按顺序写:podofo.lib、libpng.lib、zlib.lib、jpeg.lib。顺序不是玄学,链接器按顺序解析符号,被依赖的要写在后面。然后检查zlib.h和zlib.lib是否来自同一版本,把路径抓死,别留“搜索目录”让VS自己猜。
排查技巧:用dumpbin /symbols看.lib导出符号。VS2005自带dumpbin,链接器用的就是它。把podofo.lib里缺失的png函数名记下来,再在libpng.lib里查,能很快定位到哪一层断链。
5.3 编译报C2039:ssize_t不是std的成员
现象:某个头文件里写了std::ssize_t,VS2005编译器直接报错,说不认识这个成员。
原因:VS2005的C++标准库实现里没有把ssize_t放入std命名空间。ssize_t是POSIX里的类型,Windows CRT当时只有size_t。
解决:在统一预编译头或公共头文件里补上类型定义:
#if defined(_MSC_VER) && _MSC_VER < 1500 #include <BaseTsd.h> typedef SSIZE_T ssize_t; #endif逻辑说明:BaseTsd.h是Windows SDK里定义了SSIZE_T的老牌头文件,MSVC8时代可用;条件_MSC_VER < 1500限定只在VS2005及更老环境下生效,不影响新版本。参数说明:_MSC_VER的1400对应VS2005,1500对应VS2008,写1500作为分界是安全的。补上之后,把这段放进一个公共头文件,并确保出问题的cpp先include它。即使补上了typedef,函数调用时把ssize_t当size_t传参也可能出警告,编译参数加/W3就能看到,顺手改成显式转换即可。
5.4 编译告警C4819之后出现奇怪行为或链接失败
现象:源文件或第三方头文件里带中文注释或特殊字符,编译输出warning C4819提示“文件包含不能在当前代码页中表示的字符”,随后要么编译中断,要么生成的obj带上了编码污染,运行时行为不对。
原因:VS2005默认按ANSI代码页读取源文件。如果某个补丁文件是UTF-8编码保存的,中文注释在GBK代码页下被误解,编译器警告,严重时直接内部错误。
解决:把带中文注释的文件另存为ANSI编码,重新编译;或者把文件里的中文注释改成英文。最省事的做法是工程里全部文件统一用GB2312保存,不做UTF-8。有人在工程里加#pragma warning(disable:4819)压制告警,编译告警没了,但文件编码污染还在,后面出问题更难查,正路是统一编码。
5.5 编完运行就崩,Release崩Debug正常,崩在字符串或内存分配
现象:Release版本跑起来,调用PdfMemDocument::Load或PdfPainter画文字时程序崩溃,Debug版本一切正常。
原因:运行时库不一致。podofo.lib和依赖库用/MT编,主程序用/MD编,或者反过来。VS2005的CRT对跨运行时库的内存分配和释放有硬性约束,一个模块分配的内存给另一个模块释放,直接触发断言或堆损坏。
解决:静态链接方案建议全链路使用/MT,Debug用/MTd。在CMake的CMAKE_CXX_FLAGS_RELEASE里显式加/MT,主工程属性页里同样确认Runtime Library是多线程。改完后全量重新编译一次,中间产物不要混着用。验证方法很简单:编完后在podofo.lib的属性里看Runtime Library,再去主工程属性里看,两边一致再跑。
6. 验证lib库能用:一个最小读取程序与后续集成建议
6.1 用最小程序验证podofo.lib真能读写
拿到podofo.lib并配好依赖库路径后,写一个几行的程序做冒烟测试,比直接搬进项目要快得多。下面这段代码加载一个PDF文件并打印页数:
#include <podofo/podofo.h> #include <cstdio> using namespace PoDoFo; int main(int argc, char* argv[]) { if (argc < 2) { return 1; } PdfMemDocument doc; try { doc.Load(argv[1]); std::printf("pages: %d\n", doc.GetPageCount()); } catch (PdfError& e) { std::fprintf(stderr, "load pdf failed: %s\n", e.what()); return 1; } return 0; }逻辑说明:PdfMemDocument把整个PDF读进内存,Load负责解析文件,GetPageCount返回页数;解析出错时podofo抛PdfError,catch里拿到错误描述。这个程序重点验证三件事:podofo.lib能链接、依赖库符号齐全、运行时CRT一致。三种问题分别会表现成链接错误、运行崩溃和加载失败。
编译命令在VS2005命令行里执行:
cl /nologo /EHsc /MT /I D:\local\podofo-install\include ^ test_podofo.cpp /link /LIBPATH:D:\local\libs ^ podofo.lib libpng.lib zlib.lib jpeg.lib逻辑说明:/EHsc开启C++异常支持,/MT指定静态CRT,/I指向podofo安装后的头文件目录。参数说明:/LIBPATH指向统一库目录;库文件顺序按依赖关系排列,被依赖的放后面。如果这一步能编译链接并跑通,lib库的集成就算成功了。
6.2 后续集成建议与老工程配合习惯
后面的维护会不会踩坑,主要看两点:一是依赖库版本有没有记录,二是构建脚本能不能复现。我自己的习惯是在工程根目录留一个build_libs.bat,把前面所有命令按顺序固化,注释写清楚每个命令是干什么的。以后换机器或新人接手,双击执行就能出库,不用再回忆当初是怎么编出来的。
另一个容易忽略的点是头文件路径和lib路径要分开管理。podofo安装后的include目录保持只读,libs目录放编译产物,两者都固定在绝对路径下并写进工程属性。这样升级podofo版本时,不用动主工程,只替换这两处路径即可。
再说一个我的习惯:在VS2005里遇到莫名其妙的链接问题,先把“全量重新编译”当成默认操作。增量编译在依赖关系复杂时会把旧obj和新lib混在一起,出一道只有重编才能过的坎。把时间花在稳定的构建顺序上,比在IDE里反复清理单项目更值。希望这套流程和这些坑,能帮你在老工具链上少走两步。
本文还有配套的精品资源,点击获取