VS2017编译gsf/surf/mbio —E0020 未定义标识符 “F_OK“

Posted xiaokcehui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2017编译gsf/surf/mbio —E0020 未定义标识符 “F_OK“相关的知识,希望对你有一定的参考价值。

1、编译gsf报了一个错误:

严重性    代码    说明    项目    文件    行    禁止显示状态
错误(活动)    E0020    未定义标识符 "F_OK"    gsf  

d:\\OceanMultiBeamProc\\OceanMultiBeamProc\\gsf\\gsf\\gsf_indx.c    286

C语言中access/_access函数的使用_fengbingchun的博客-CSDN博客_c access

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

windows下VS 无法打开源文件 unistd.h_明天也要加油鸭的博客-CSDN博客_"无法打开 源 文件 \\"unistd.h"

VS编译C++错误 C1083 无法打开包括文件: “unistd.h”: No such file or directory_摸鱼骑士CE的博客-CSDN博客_无法打开源文件unistd.h

不用清理,直接点击生成即可

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

以上是关于VS2017编译gsf/surf/mbio —E0020 未定义标识符 “F_OK“的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VS 2017 中从其他编译器编译代码 [关闭]

VS2017编译LevelDB

[C++][修改]GDAL源码编译vs2015/vs2017/vs2019

编译OpenJDK11,必须使用VS 2017

使用VS2017编译OpenJDK8(未成功)

windows从源码编译openssl1.1.1(vs2019vs2017)