编译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

You may also like...