1、编译gsf报了一个错误:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E0020 未定义标识符 "F_OK" gsf
d:\OceanMultiBeamProc\OceanMultiBeamProc\gsf\gsf\gsf_indx.c 286
access函数用来判断指定的文件或目录是否存在(F_OK),已存在的文件或目录是否有可读(R_OK)、可写(W_OK)、可执行(X_OK)权限。F_OK、R_OK、W_OK、X_OK这四种方式通过access函数中的第二个参数mode指定。如果指定的方式有效,则此函数返回0,否则返回-1。
在Windows下没有access函数,但在<io.h>文件中有_access函数,声明如下:
int _access(const char* _Filename, int _AccessMode);
windows下的函数_access与linux下的access函数功能类似,用来判断指定的文件或目录是否仅存在(00),已存在的文件或目录是否有仅读(04)、仅写(02)、既可读又可写(06)权限。这四种方式通过_access函数中的第二个参数mode指定,如果mode传入的值不是0或2或4或6,调用此函数则会crash。如果指定的方式有效,则此函数返回0,否则返回-1。
F_OK =0
W_OK =2
R_OK= 4
X_OK=6
2、第二个错误:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 htonl,该符号在函数 gsfWrite 中被引用 gsf D:\OceanMultiBeamProc\OceanMultiBeamProc\gsf\gsf.obj 1
还有一种报错:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2001 无法解析的外部符号 __imp_gethostname mbio D:\OceanMultiBeamProc\OceanMultiBeamProc\mbio\mb_esf.obj 1
htonl来自于winsock.h
对应的lib文件为WS2_32.Lib
编译mbaux需要gdal:
生成mbaux需要gdal,下载gdal2.2.1源代码,使用cmake生成VS2017项目,编译完成
但没有执行安装操作,install,libinstall,devinstall
在VS2017生成命令增加上面三个命令
nmake -f makefile.vc MSVC_VER=1910 WIN64=1 install && nmake -f makefile.vc MSVC_VER=1910 WIN64=1 libinstall && nmake -f makefile.vc MSVC_VER=1910 WIN64=1 devinstall
3、第三个错误:
错误(活动) E1696 无法打开 源 文件 "unistd.h" mbaux d:\OceanMultiBeamProc\OceanMultiBeamProc\mbaux\mbaux\mb_readwritegrd.c 27
不用清理,直接点击生成即可
4、第四个错误:
def文件必须在VS2017的编译选项“模块定义文件”中输入,否则exports为空
并且有可能不生成lib文件
5、取消MBTRN功能
//#define MBTRN_ENABLED 1
根据makefile.am中的.h和.c文件
去掉
mbsys_templatesystem.h
mbr_tempform.c
mbsys_templatesystem.c
6、严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 GMT_runtime_bindir_win32,该符号在函数 mb_proj_init 中被引用 mbio D:\OceanMultiBeamProc\OceanMultiBeamProc\mbio\mb_proj.obj 1
#ifdef USE_PROJ4_API
#define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
PROJ4过时库造成的,要求Proj 6+
使用PROJ6.0.0,需要sqlite3,下载sqlite3.dll生成lib
lib /def:sqlite3.def /machine:x64 /out:sqlite3.lib
生成PROJ6 的VS2017项目需要sqlite3.exe,所以下载sqlite3的src,用VS2017编译成sqlite3.exe
编译PROJ6,设置为shared,会生成proj6.0.dll,pro6.0.lib
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 proj_normalize_for_visualization,该符号在函数 mb_proj6_init 中被引用 mbio D:\OceanMultiBeamProc\OceanMultiBeamProc\mbio\mb_proj.obj 1
不认识proj_normalize_for_visualization,版本有点低
用PROJ6.3.0的proj.h文件里由这个函数proj_normalize_for_visualization
至此可以生成了:
mb_bsio.dll
mb_gsf.dll
mb_sapi.dll
mb_mbio.dll