前言
基本定义:CxImage类库是一个优秀的图像操作类库。它可以快捷地存取、显示、转换各种图像。
下载
编译过程
1、版本转换,直接用VS2017打开 CxImgLib.dsw, 就可以转换为CxImgLib.sln
正常打开之后,有13个项目。逐个项目,查看属性。发现其字符集默认均为:多字节字符集或空着。将每个项目都修改为Unicode,或者不修改,都可以编译通过。这两种情况,我都尝试过了。所以读者可以根据需要进行设置。
2、编译顺序:jasper、jbig、jpeg、libdcr、mng、png、tiff、zlib 这8个库,然后编译cximage、CxImageCtrlDll,最后编译CxImageMfcDll,最最后面,处理demo,demoDll。
3、将每个项目:debug、32位、 设置好字符集Unicode、多线程调试(/MTd)【release版本,需设置为 MT】。 然后 直接编译,会报错,例如:编译 jasper, 生成出错:
1>cl : 命令行 warning D9035: “Gm”选项已否决,并将在将来的版本中移除
1>cl : 命令行 error D8016: “/ZI”和“/Gy-”命令行选项不兼容
所以先更改属性,从 否(/Gy-) 改为 是(/Gy)。 重新编译,通过。
jasper,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
jbig,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
jpeg,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
libdcr,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
mng,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
png,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
tiff,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
zlib,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
cximage,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
4、每一个项目中,都有一个debug文件,debug文件中,就有生成对应的 *.lib 文件。在raw/debug/ 文件中,编译生成了一个libdcr.lib 的文件,对应项目中,是libdcr项目。
cximage、jasper、jbig、jpeg、libdcr、mng、png、tiff、zlib这9个项目是生成静态库文件的,
对应的静态库文件分别是cximage.lib;jasper.lib;jbig.lib;jpeg.lib;libdcr.lib;mng.lib;png.lib;tiff.lib;zlib.lib;
5、先编译CxImageCtrlDll,后编译CxImageMfcDll。修改字符集,与上面保持一致。
CxImageCtrlDll,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
CxImageMfcDll,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
配置属性:(我将上面生成的9个lib文件,放到了一起,然后连接好路径,直接添加附加依赖项。)
CxImageCtrlDll 顺利通过,编译生成如下::========== 生成: 成功 1 个,失败 0 个,最新 8 个,跳过 0 个 ==========
CxImageMfcDll 编译报错:
报错一:
fatal error C1189: #error: MFC does not support WINVER less than 0x0501. Please change the definition of WINVER in your project properties or precompiled header.
解决方案:
// 此三行会产生为题,用下面两行代替。data:2021/5/19
//#ifndef WINVER
//#define WINVER 0x0400
//#endif
#define WINVER 0x0602
#define _WIN32_WINNT 0x0602
重新生成,报错二:
9>mfcs140d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dll_dllmain_stub.obj) 中定义
9> 正在创建库 .\Debug\cximaged.lib 和对象 .\Debug\cximaged.exp
9>../../bin/cximaged.dll : fatal error LNK1169: 找到一个或多个多重定义的符号
9>已完成生成项目“cximagemfcdll.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 8 个,失败 1 个,跳过 0 个 ==========
还未解决。。。
6、编译demo,demoDll
demo,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
demoDll,需要将 否(/Gy-) 改为 是(/Gy); 编译通过。
demo 报错:
fatal error C1189: #error: MFC does not support WINVER less than 0x0501. Please change the definition of WINVER in your project properties or precompiled header.
修改方法同上。
demo的最后结果如下:在debug下,确实生成了demo.lib文件。但是,因为缺少lib库,所以出现的问题。
10> 正在创建库 .\Debug\demo.lib 和对象 .\Debug\demo.exp
10>demoDoc.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall CxImage::CxImage(char const *,unsigned long)" (??0CxImage@@QAE@PBDK@Z),该符号在函数 "public: virtual int __thiscall CDemoDoc::OnOpenDocument(char const *)" (?OnOpenDocument@CDemoDoc@@UAEHPBD@Z) 中被引用
10>demoDoc.obj : error LNK2019: 无法解析的外部符号 "public: static unsigned long __cdecl CxImage::GetTypeIdFromName(char const *)" (?GetTypeIdFromName@CxImage@@SAKPBD@Z),该符号在函数 "public: int __thiscall CDemoDoc::FindType(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > const &)" (?FindType@CDemoDoc@@QAEHABV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z) 中被引用
10>demoDoc.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall CxImage::Load(char const *,unsigned long)" (?Load@CxImage@@QAE_NPBDK@Z),该符号在函数 "public: virtual int __thiscall CDemoDoc::OnOpenDocument(char const *)" (?OnOpenDocument@CDemoDoc@@UAEHPBD@Z) 中被引用
10>demoDoc.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall CxImage::Save(char const *,unsigned long)" (?Save@CxImage@@QAE_NPBDK@Z),该符号在函数 "public: virtual int __thiscall CDemoDoc::OnSaveDocument(char const *)" (?OnSaveDocument@CDemoDoc@@UAEHPBD@Z) 中被引用
10>../bin/demod.exe : fatal error LNK1120: 4 个无法解析的外部命令
10>已完成生成项目“demo.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 9 个,失败 1 个,跳过 0 个 ==========
demoDll 编译,直接通过。========== 全部重新生成: 成功 10 个,失败 0 个,跳过 0 个 ==========
demoDll.exe 直接运行结果:
Unicode版本编译问题:
1、CxImageMfcDll 改为Unicode,配置附加依赖项,生成,报错如下:
9>mfcs140ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dll_dllmain_stub.obj) 中定义
9> 正在创建库 .\Debug\cximaged.lib 和对象 .\Debug\cximaged.exp
9>../../bin/cximaged.dll : fatal error LNK1169: 找到一个或多个多重定义的符号
9>已完成生成项目“cximagemfcdll.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 8 个,失败 1 个,跳过 0 个 ==========
解决方案: 暂无。
编译release32位版本Unicode
每次都是CxImageMfcDll 出问题:
9>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn.inl(400): error C2065: “TVIF_STATEEX”: 未声明的标识符
9>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn.inl(402): error C2065: “TVIF_EXPANDEDIMAGE”: 未声明的标识符
9>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn2.inl(270): error C2065: “RB_SETEXTENDEDSTYLE”: 未声明的标识符
9>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn2.inl(272): error C2065: “RB_GETEXTENDEDSTYLE”: 未声明的标识符
9>已完成生成项目“cximagemfcdll.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 8 个,失败 1 个,跳过 0 个 ==========
demo 出现的问题:
10>------ 已启动全部重新生成: 项目: demo, 配置: Release Win32 ------
10>StdAfx.cpp
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn.inl(400): error C2065: “TVIF_STATEEX”: 未声明的标识符
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn.inl(402): error C2065: “TVIF_EXPANDEDIMAGE”: 未声明的标识符
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn2.inl(270): error C2065: “RB_SETEXTENDEDSTYLE”: 未声明的标识符
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn2.inl(272): error C2065: “RB_GETEXTENDEDSTYLE”: 未声明的标识符
10>已完成生成项目“demo.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 9 个,失败 1 个,跳过 0 个 ==========
demoDll 出现的问题:
10>------ 已启动全部重新生成: 项目: demoDll, 配置: Release Win32 ------
10>StdAfx.cpp
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn.inl(400): error C2065: “TVIF_STATEEX”: 未声明的标识符
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn.inl(402): error C2065: “TVIF_EXPANDEDIMAGE”: 未声明的标识符
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn2.inl(270): error C2065: “RB_SETEXTENDEDSTYLE”: 未声明的标识符
10>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\atlmfc\include\afxcmn2.inl(272): error C2065: “RB_GETEXTENDEDSTYLE”: 未声明的标识符
10>已完成生成项目“demoDLL.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 9 个,失败 1 个,跳过 0 个 ==========
顺利的将9个lib文件编译出,即可用。
参考链接
https://www.pianshen.com/article/48413895/ 编译