编译GDAL静态库
GDAL通常是使用动态库,在网上众多的资料也是关于GDAL动态库的编译的文章,在工作中可能由于某些原因需要使用GDAL静态库,花了点时间侥幸编译出来,现在和大家分享下。
1.编译工具及GDAL版本
编译工具VS2012(使用cmake命令),GDAL版本GDAL1.11
2.编译过程
1)修改nmake.opt文件
修改opt文件中的132行左右内容
OPTFLAGS= $(CXX_ANALYZE_FLAGS) $(CXX_PDB_FLAGS) /nologo /MD /EHsc /Ox /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DNDEBUG
!ELSE
OPTFLAGS= $(CXX_ANALYZE_FLAGS) $(CXX_PDB_FLAGS) /nologo /MD /EHsc /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DDEBUG
!ENDIF
!ELSE
!IFNDEF DEBUG
OPTFLAGS= $(CXX_PDB_FLAGS) /nologo /MD /EHsc /GR /Ox /DNDEBUG
!ELSE
OPTFLAGS= $(CXX_PDB_FLAGS) /nologo /MD /EHsc /GR /DDEBUG
修改为
OPTFLAGS= $(CXX_ANALYZE_FLAGS) $(CXX_PDB_FLAGS) /nologo /MD /EHsc /Ox /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DNDEBUG
!ELSE
OPTFLAGS= $(CXX_ANALYZE_FLAGS) $(CXX_PDB_FLAGS) /nologo /MDd /EHsc /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /DDEBUG
!ENDIF
!ELSE
!IFNDEF DEBUG
OPTFLAGS= $(CXX_PDB_FLAGS) /nologo /MD /EHsc /GR /Ox /DNDEBUG
!ELSE
OPTFLAGS= $(CXX_PDB_FLAGS) /nologo /MDd /EHsc /GR /DDEBUG
即将MD修改为MDd,只有编译debug版本需要修改
64位编译需要将171行左右WIN64=YES这句的注释去掉
2)使用cmake命令编译
进入opt文件同目录下,切换到GDAL的源代码目录后,依次敲入下面的命令行后回车,等待编译结束即可。编译命令如下面、红色字体显示,运行下面命令一般不会出现错误。
nmake -f makefile.vc MSVC_VER=1700 DEBUG=1
nmake -f makefile.vc install
nmake -f makefile.vc devinstall
注:GDAL opt中默认是使用vs2008编译,编译vs2012版本需要设置vs版本
如果运行完上边命令没发现错,说明GDAL已经编译完成,在opt同目录下找到gdal.lib即为所需的静态库。
3.静态库使用
编译出静态库,使用也会碰到问题,主要问题如下:
问题1:
1>Link:
1>Creating library E:\vs2012 projects\iwaveVS\x64\Release\iwaveVS.lib and object E:\vs2012 projects\iwaveVS\x64\Release\iwaveVS.exp
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_getaddrinfo
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_freeaddrinfo
1>E:\vs2012 projects\iwaveVS\x64\Release\iwaveVS.exe : fatal error LNK1120: 2 unresolved externals
问题2:
1>Creating library E:\vs2012 projects\iwaveVS\x64\Release\iwaveVS.lib and object E:\vs2012 projects\iwaveVS\x64\Release\iwaveVS.exp
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_closesocket
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_connect
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_recv
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_send
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_socket
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_WSAStartup
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_WSACleanup
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_getaddrinfo
1>gdal.lib(gdalclientserver.obj) : error LNK2001: unresolved external symbol __imp_freeaddrinfo
1>E:\vs2012 projects\iwaveVS\x64\Release\iwaveVS.exe : fatal error LNK1120: 9 unresolved externals
1>
1>Build FAILED.
经查证,发现VS2012编译的时候不会将其所需的静态库打包进去,只需在引用库中添加wsock32.lib和WS2_32.Lib即可。
目前为止静态库编译完成,希望能帮到大家!
转载自:https://blog.csdn.net/haoswich/article/details/25650509