zlibvs编译
‘壹’ 使用nmake编译Gdal源代码(Win10+VS2022)
为了编译Gdal-master的源码,需要PROJ的支持,而PROJ又需要SQLite的支持。
SQLite、PROJ、Gdal-master的源码及编译可参见网页:
https://www.toutiao.com/a7063703225425199623/?log_from=fe233e3892be3_1644664643652
也可使用nmake在命令行创建(参考网页 https://trac.osgeo.org/gdal/wiki/BuildingOnWindows )
使用命令行,进入VS2022开发者命令行窗口
cd D:ProgramsMicrosoft Visual
D:
vcvars64.bat
cd D:SourceCodesgdal-master
set BINDIR=d:programsgdalgdal-bin
set DATADIR=d:programsgdalgdal-data
set INCDIR=d:programsgdalgdal-include
set LIBDIR=d:programsgdalgdal-lib
修改文件“nmake.opt”的内容:
(1)将
#PROJ_INCLUDE = -Id:install-projlocalinclude
改为
PROJ_INCLUDE = -ID:My3rdPartyinclude
(2)将
#PROJ_LIBRARY = d:install-projlocallibproj_6_0.lib shell32.lib ole32.lib
改为
PROJ_LIBRARY = D:My3rdPartylibproj.lib shell32.lib ole32.lib
依次使用下列命令, 创建x64的Release版本
nmake -f makefile.vc MSVC_VER=1930 WIN64=1
nmake /f makefile.vc install MSVC_VER=1930 WIN64=yes
nmake /f makefile.vc devinstall MSVC_VER=1930 WIN64=yes
执行完毕后,目录“d:programsgdal”中的内容如下(使用命令 “tree /f d:programsgdal” 列出)
D:PROGRAMSGDAL
gdal-bin
gdal303.dll
gdaladdo.exe
gdalbuildvrt.exe
gdaldem.exe
gdalenhance.exe
gdalinfo.exe
gdallocationinfo.exe
gdalmanage.exe
gdalmdiminfo.exe
gdalmdimtranslate.exe
gdalsrsinfo.exe
gdaltindex.exe
gdaltransform.exe
gdalwarp.exe
gdal_contour.exe
gdal_create.exe
gdal_grid.exe
gdal_rasterize.exe
gdal_translate.exe
gdal_viewshed.exe
gnmanalyse.exe
gnmmanage.exe
nearblack.exe
ogr2ogr.exe
ogrinfo.exe
ogrlineref.exe
ogrtindex.exe
gdalplugins
drivers.ini
gdal-data
bag_template.xml
cubewerx_extra.wkt
default.rsc
ecw_cs.wkt
eedaconf.json
epsg.wkt
esri_StatePlane_extra.wkt
gdalicon.png
GDALLogoBW.svg
GDALLogoColor.svg
GDALLogoGS.svg
gdalmdiminfo_output.schema.json
gdalvrt.xsd
gmlasconf.xml
gmlasconf.xsd
gml_registry.xml
grib2_center.csv
grib2_process.csv
grib2_subcenter.csv
grib2_table_4_2_0_0.csv
grib2_table_4_2_0_1.csv
grib2_table_4_2_0_13.csv
grib2_table_4_2_0_14.csv
grib2_table_4_2_0_15.csv
grib2_table_4_2_0_16.csv
grib2_table_4_2_0_17.csv
grib2_table_4_2_0_18.csv
grib2_table_4_2_0_19.csv
grib2_table_4_2_0_190.csv
grib2_table_4_2_0_191.csv
grib2_table_4_2_0_2.csv
grib2_table_4_2_0_20.csv
grib2_table_4_2_0_3.csv
grib2_table_4_2_0_4.csv
grib2_table_4_2_0_5.csv
grib2_table_4_2_0_6.csv
grib2_table_4_2_0_7.csv
grib2_table_4_2_10_0.csv
grib2_table_4_2_10_1.csv
grib2_table_4_2_10_191.csv
grib2_table_4_2_10_2.csv
grib2_table_4_2_10_3.csv
grib2_table_4_2_10_4.csv
grib2_table_4_2_1_0.csv
grib2_table_4_2_1_1.csv
grib2_table_4_2_1_2.csv
grib2_table_4_2_20_0.csv
grib2_table_4_2_20_1.csv
grib2_table_4_2_20_2.csv
grib2_table_4_2_2_0.csv
grib2_table_4_2_2_3.csv
grib2_table_4_2_2_4.csv
grib2_table_4_2_2_5.csv
grib2_table_4_2_3_0.csv
grib2_table_4_2_3_1.csv
grib2_table_4_2_3_2.csv
grib2_table_4_2_3_3.csv
grib2_table_4_2_3_4.csv
grib2_table_4_2_3_5.csv
grib2_table_4_2_3_6.csv
grib2_table_4_2_4_0.csv
grib2_table_4_2_4_1.csv
grib2_table_4_2_4_10.csv
grib2_table_4_2_4_2.csv
grib2_table_4_2_4_3.csv
grib2_table_4_2_4_4.csv
grib2_table_4_2_4_5.csv
grib2_table_4_2_4_6.csv
grib2_table_4_2_4_7.csv
grib2_table_4_2_4_8.csv
grib2_table_4_2_4_9.csv
grib2_table_4_2_local_Canada.csv
grib2_table_4_2_local_HPC.csv
grib2_table_4_2_local_index.csv
grib2_table_4_2_local_MRMS.csv
grib2_table_4_2_local_NCEP.csv
grib2_table_4_2_local_NDFD.csv
grib2_table_4_5.csv
grib2_table_versions.csv
gt_datum.csv
gt_ellips.csv
header.dxf
inspire_cp_BasicPropertyUnit.gfs
inspire_cp_CadastralBoundary.gfs
inspire_cp_CadastralParcel.gfs
inspire_cp_CadastralZoning.gfs
jpfgdgml_AdmArea.gfs
jpfgdgml_AdmBdry.gfs
jpfgdgml_AdmPt.gfs
jpfgdgml_BldA.gfs
jpfgdgml_BldL.gfs
jpfgdgml_Cntr.gfs
jpfgdgml_CommBdry.gfs
jpfgdgml_CommPt.gfs
jpfgdgml_Cstline.gfs
jpfgdgml_ElevPt.gfs
jpfgdgml_GCP.gfs
jpfgdgml_LeveeEdge.gfs
jpfgdgml_RailCL.gfs
jpfgdgml_RdArea.gfs
jpfgdgml_RdASL.gfs
jpfgdgml_RdCompt.gfs
jpfgdgml_RdEdg.gfs
jpfgdgml_RdMgtBdry.gfs
jpfgdgml_RdSgmtA.gfs
jpfgdgml_RvrMgtBdry.gfs
jpfgdgml_SBAPt.gfs
jpfgdgml_SBArea.gfs
jpfgdgml_SBBdry.gfs
jpfgdgml_WA.gfs
jpfgdgml_WL.gfs
jpfgdgml_WStrA.gfs
jpfgdgml_WStrL.gfs
LICENSE.TXT
netcdf_config.xsd
nitf_spec.xml
nitf_spec.xsd
ogrvrt.xsd
osmconf.ini
ozi_datum.csv
ozi_ellips.csv
pci_datum.txt
pci_ellips.txt
pdfcomposition.xsd
pds4_template.xml
plscenesconf.json
ruian_vf_ob_v1.gfs
ruian_vf_st_uvoh_v1.gfs
ruian_vf_st_v1.gfs
ruian_vf_v1.gfs
s57agencies.csv
s57attributes.csv
s57expectedinput.csv
s57objectclasses.csv
seed_2d.dgn
seed_3d.dgn
stateplane.csv
template_tiles.mapml
tms_LINZAntarticaMapTileGrid.json
tms_MapML_APSTILE.json
tms_MapML_CBMTILE.json
tms_NZTM2000.json
trailer.dxf
vdv452.xml
vdv452.xsd
vicar.json
gdal-include
armadillo_headers.h
cplkeywordparser.h
cpl_alibaba_oss.h
cpl_atomic_ops.h
cpl_auto_close.h
cpl_aws.h
cpl_azure.h
cpl_compressor.h
cpl_config.h
cpl_config_extras.h
cpl_conv.h
cpl_cpu_features.h
cpl_csv.h
cpl_curl_priv.h
cpl_error.h
cpl_error_internal.h
cpl_float.h
cpl_google_cloud.h
cpl_hash_set.h
cpl_http.h
cpl_json.h
cpl_json_header.h
cpl_json_streaming_parser.h
cpl_json_streaming_writer.h
cpl_list.h
cpl_md5.h
cpl_mem_cache.h
cpl_minixml.h
cpl_minizip_ioapi.h
cpl_minizip_unzip.h
cpl_minizip_zip.h
cpl_multiproc.h
cpl_odbc.h
cpl_port.h
cpl_progress.h
cpl_quad_tree.h
cpl_sha1.h
cpl_sha256.h
cpl_spawn.h
cpl_string.h
cpl_swift.h
cpl_time.h
cpl_userfaultfd.h
cpl_vax.h
cpl_virtualmem.h
cpl_vsi.h
cpl_vsil_curl_class.h
cpl_vsil_curl_priv.h
cpl_vsil_plugin.h
cpl_vsi_error.h
cpl_vsi_virtual.h
cpl_worker_thread_pool.h
cpl_zlib_header.h
gdal.h
gdalexif.h
gdalgeorefpamdataset.h
gdalgrid.h
gdalgrid_priv.h
gdaljp2abstractdataset.h
gdaljp2metadata.h
gdaljp2metadatagenerator.h
gdallinearsystem.h
gdalpansharpen.h
gdalpython.h
gdalsse_priv.h
gdalwarper.h
gdalwarpkernel_opencl.h
gdal_alg.h
gdal_alg_priv.h
gdal_csv.h
gdal_frmts.h
gdal_mdreader.h
gdal_pam.h
gdal_priv.h
gdal_proxy.h
gdal_rat.h
gdal_simplesurf.h
gdal_thread_pool.h
gdal_utils.h
gdal_version.h
gdal_vrt.h
gnm.h
gnmgraph.h
gnm_api.h
gvgcpfit.h
internal_qhull_headers.h
memdataset.h
nasakeywordhandler.h
ograpispy.h
ogrgeomediageometry.h
ogrpgeogeometry.h
ogrsf_frmts.h
ogr_api.h
ogr_attrind.h
ogr_core.h
ogr_expat.h
ogr_feature.h
ogr_featurestyle.h
ogr_geocoding.h
ogr_geometry.h
ogr_geos.h
ogr_geo_utils.h
ogr_libs.h
ogr_p.h
ogr_proj_p.h
ogr_sfcgal.h
ogr_spatialref.h
ogr_srs_api.h
ogr_srs_esri_names.h
ogr_swq.h
ogr_xerces.h
ogr_xerces_headers.h
rawdataset.h
thinplatespline.h
vrtdataset.h
gdal-lib
gdal_i.lib
‘贰’ win10 64vs怎么编译 libpng
1. 先下载 libpng(http://sourceforge.net/projects/libpng/files/)和libz(http://zlib.net/zlib-1.2.7.tar.gz),将libpng解压,如C:\workspace\libpng\。
2. 将libz解压,改名zlib放到libpng同级目录,如C:\workspace\zlib。
3. 进入libpng\projects\visualc71\,用visual studio打开工程文件,方案中会有三个子工程:libpng, pngtest, zlib。直接编译,不出意外会在Win32_DLL_Debug目录下和Win32_DLL_Debug\ZLib目录下生成zlib1d.dll, libpng15d.dll, libpng.lib和zlib.lib等库文件。
4.若报错,拷贝scripts/pnglibconf.h.prebuilt到源码目录,改名为pnglibconf.h
对于要用到这两个库的工程,主要需要做三件事:
1. C/C++常规->附加包含目录中把包含png.h等头文件的目录加进来
2. 链接器->输入->附加依赖项中加zlib.lib;libpng.lib。
3.通用属性->VC++ 目录->库目录中把放着zlib.lib和libpng.lib的目录加进来。
‘叁’ 如何在VS2015中集成QT5.5
1. 首先,我们下载源码包,加压源码包到磁盘。
2. 由于编译QtWekbit需要ICU andANGLE 库,ICU库需要单独下载和编译,下载ICU4Cversion 56.1并解压到磁盘,目录位置参见随后说明。
3. 在Qt 5.5.1的源码包中还存在一个BUG,如果直接编译的话在编译QT3D模块的时候会报没有找到Zlib.h的错误而中断编译,所以参照如下提示修改qt-everywhere-opensource-src-5.5.1\qt3d\src\3rdparty\assimp目录下的assimp.pri文件。可参考地址codereview.qt-project.org/...mp.pri。
4. 在编译QT5.5.1之前还需要安装配置一下的工具和环境:
5. 经过上面的步骤可以开始进行编译ICU4C version 56.1和QT5.5.1的源码了
6. 如果以上的配置都正确的话开机让机器编译几个小时后就可以在目标路径下生成QT5.5.1的运行文件。
‘肆’ 怎么编译windows 64位版本的libav
libav是ffmpeg的一个分支,我纯粹是出于喜欢avconv和avprobe这样清晰的命名才对它有好感。
因为官方网站有一个编译指南,以下只是本人在实际编译过程中的一些问题点的记录。
编译环境准备
因为libav使用configure脚本来编译,所以必须要安装mingw的msys,这样可以有一个bash来运行configure脚本,以及保证一个可用的gnu make来执行编译。现在安装Mingw可以使用mingw-get,类似于一个包管理器,我们只需要msys的包和coreutils的ext包就可以了。
其次我使用VS2013 Express版本的msvc来编译。在之前版本的msvc,只需要安装Windows SDK那个光盘镜像就可以有一个命令行的编译环境了,但是VS2013之后,必须安装VS2013的光盘镜像才可以(Express版本足矣)。
另外libav中有汇编代码,语法是yasm,所以得下载一份windows版本的yasm。
依赖的第三方库准备
我只准备了zlib和libfdk_aac两个库,前者其实我不知道libav哪里用了,只是看到指南中有提及,就下载了,libfdk_aac据说是目前开源界最好的aac编解码库,只是因为用了一个custom的license,所以用它编译出来的二进制文件是禁止发布的,所以想用支持这个库的libav只能自己编译用。
按照指南中的说明来修改编译zlib即可,非常straight forward,只是要编译一个x64的zlib.lib有需要注意的地方;cl.exe编译object file的时候是没有选项来指定要生成32位还是64位的,相反的,它用不同的cl.exe用来实现这一点,使用vs2013的两个命令行快捷方式开启编译环境命令行即可(也就是给vcvarsall.bat传递不同的参数来打开相应的编译环境命令行,例如我安装的32位的VS2013 Express,就可以用vcvarsall.bat x86_amd64在PATH中准备好一个本身是32位的但生成的目标文件是64bit的cl.exe)。
libfdk_aac的代码中没有为msvc的toolchain来准备任何配置,所以我采用的最笨的方法:在VC中新建一个static library类型的工程,然后把需要的文件全部添加进来(除了aac decoder的部分),并且配置各种细节,来生成最后的64位的fdk-aac.lib文件。
configure libav
然后把zlib的头文件和libfdk_aac的encoder的头文件放到3rd/headers,把刚才生成的lib放到3rd/libs。正如指南中说的,msvc的toolchain会使用INCLUDE和LIB两个环境变量来确定头文件和库文件的位置;在打开vcvarsall.bat之后,这两个变量已经带了系统库的设定;而我们需要在./configure和make执行的时候,都要在这两个变量中加上我们的3rd环境;因为用msys的bash来运行,只需要在这两个命令前面如此设置即可:
INCLUDE=3rd/headers/;$INCLUDE LIB=3rd/libs/;$LIB ./configure
还有需要删除mingw的link.exe,避免与msvc中的link.exe冲突,指南中也提到了。
另外附上我的configure参数,因为我的fdk-aac.lib中没有解码器,我专门声明了不使用它的解码器:
./configure --disable-debug \
--enable-gpl --enable-nonfree \
--enable-runtime-cpudetect \
--disable-avplay --disable-avserver \
--disable-encoder=aac \
--enable-libfdk-aac --disable-decoder=libfdk_aac \
--toolchain=msvc
libav本身的修改和make
libav在windows下,会把通过GetCommandLineW()来获取UTF-16LE版本的命令行参数,并转换成UTF-8之后才进行后续的所有操作(libav内部都是用UTF-8来统一对待字符串编码的);但是在往控制台打log的时候,直接用fputs接口向stderr打印UTF-8的multibyte字符串,在CP_ACP(ANSI codepage)为gbk的中文windows上,字符串中的非ascii字符(例如刚才命令行传入的中文文件名)就会打印为乱码(因为系统用GBK来解码UTF-8的字符串)。
解决方案是:
先用MultiByteToWideChar()把待打印的UTF-8 multibyte字符串转换回UTF-16LE的wchar_t字符串;
这时候如果用fwputs来打印转换后的字符串,会发现一遇到非ascii字符就会调用失败(打印停止),这是因为默认的locale中的LC_TYPE(这个locale category专门控制字符相关的操作的)是"C",用setlocale(LC_TYPE, "")设置为系统默认(中文系统为GBK),或者显式调用setlocale(LC_TYPE, ".936")设置为GBK,就能成功打印出UTF-16LE中的GBK能表示的字符;
但是这个locale+fwputs的方案只能显示出一种ANSI方案支持的字符,想显示出所有UTF-16LE支持的字符,应该直接使用windows的API调用,WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcMsg, wcMsgLen, &wcMsgLen, NULL)。
以下是我对libavutil/log.c的patch:
--- log.c 2014-08-04 10:02:34 +0800
+++ libav-64bit/libav-10.3/libavutil/log.c 2014-09-10 06:42:02 +0800
@@ -59,6 +59,10 @@
static void colored_fputs(int level, const char *str)
{
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ int wcBufLen = 0;
+ wchar_t* wcBuf = NULL;
+#endif
if (use_color < 0) {
#if HAVE_SETCONSOLETEXTATTRIBUTE
CONSOLE_SCREEN_BUFFER_INFO con_info;
@@ -83,7 +87,19 @@
if (use_color) {
set_color(level);
}
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
+ if (wcBufLen == 0) {
+ fputs("Failed to convert multibyte log string to widechar.\n", stderr);
+ exit(1);
+ }
+ wcBuf = (wchar_t*)malloc(wcBufLen *2);
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, wcBuf, wcBufLen);
+ WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcBuf, wcBufLen, &wcBufLen, NULL);
+ free((void*)wcBuf);
+#else
fputs(str, stderr);
+#endif
if (use_color) {
reset_color();
}
使用avconv的简易教程
avprobe xxx.mkv
看清音轨是哪个,也就是一个数字音轨号;其实大部分时候一个容器中的所有音轨都是一种格式的,所以其实也不用看,下面用a指定所有的就好了
avconv -i xxx.mkv -c -c:1 libdfk_aac out.mkv
以上把1号轨按照aac重新编码,别的轨全部对拷
avconv -i xxx.mkv -c -c:a libdfk_aac out.mkv
以上把所有音轨按照aac重新编码,别的轨全部对拷
avconv -i xxx.mkv -i xxx.srt -c -c:a libdfk_aac out.mkv
以上演示另外附加一个srt,注意所有的-c参数都要放在所有-i文件之后
如何去掉输入文件中的某些轨呢(需要借鉴avprobe xxx.mkv的输出了):
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 out.mkv
以上语句实现功能跟不加-map 0一样,map 0是说把第0号输入文件中的所有轨都输入到out.mkv
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v out.mkv
以上语句讲只输出视频轨
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v -map 0:1 -map 0:s out.mkv
如果输入文件中0为视频,1和2均为音频轨,3和4为字幕轨,以上语句可以只输出0 1 3轨,不输出2号音频轨
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:0 -map 0:1 -map 0:3 -map 0:4 out.mkv
以上功能相同,只是完全用轨的数字序号来表示
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 -map -0:2 out.mkv
以上功能相同,只是用“负”来表示从之前形成的map中去掉指定的轨
注意map选项用在输出之前,所有-i之后
某些文件(例如avi)在remux到mkv的时候会报错,给avconv加上-fflags +genpts一般能解决