无法在 x64 中构建 gdal

Posted

技术标签:

【中文标题】无法在 x64 中构建 gdal【英文标题】:Can't build gdal in x64 【发布时间】:2013-05-13 15:50:37 【问题描述】:

我正在尝试在 x64 中构建 GDAL (1.9.2)。

在说明中,我看到:

# Uncomment the following if you are building for 64-bit windows
# (x64). You'll need to have PATH, INCLUDE and LIB set up for 64-bit
# compiles.
!IF "$(PLATFORM)" == "x64"
WIN64=YES
!ENDIF

然后,更低,

# Under win64, symbols for function names lack the underscore prefix
# present on win32. Also the STDCALL calling convention is not used.
!IFDEF WIN64
!UNDEF STDCALL
!ELSE
SYM_PREFIX=_
!ENDIF

找不到特定于 x64 的 PATH、INCLUDE 和 LIB,或者我应该做的任何其他事情......

我可以在 Win32 中构建。

在 x64 中,出现链接器错误:

LINK : error LNK2001: unresolved external symbol _OGRFeatureStylePuller
LINK : error LNK2001: unresolved external symbol _OSRValidate
...
gdal19.dll : fatal error LNK1120: 74 unresolved externals
NMAKE : fatal error U1077: '"c:\Program Files (x86)\Microsoft Visual Studio 
10.0\VC\BIN\link.EXE"' : return code '0x460'

我把(建立在Win32)

!IFNDEF PLATFORM
PLATFORM=WIN32
!ENDIF

修改为

!IFNDEF PLATFORM
PLATFORM=x64
!ENDIF

(在 x64 中构建)- 它有效。但前提是我从 Visual Studio 内部构建。

我希望能够使用 bat 文件(并构建所有平台/配置) 以上 - 虽然它在 VS 中构建,但它不会从命令行构建 (使用命令:

start /b /wait nmake -f makefile.vc clean
start /b /wait nmake.exe /f makefile.vc PLATFORM=x64
start /b /wait nmake.exe /f makefile.vc devinstall PLATFORM=x64

在 Win32 中构建完全相同的东西...

我不知道哪里出了问题……

【问题讨论】:

【参考方案1】:

我设法使用http://dominoc925.blogspot.ru/2013/03/build-64-bit-gdal-for-windows.html 中的步骤在 Visual Studio 2012 下构建了 x64 版本的 GDAL:

    从http://download.osgeo.org/gdal/下载gdal-1.9.2.tar.gz(或其他版本的源代码)

    解压到某个目录,例如C:\tmp\gdal-1.9.2\

    如果您之前尝试构建 GDAL(例如 x86),请确保构建目录(C:\warmerda\bld\)和源目录在之前的构建尝试中是干净的。如果不确定,请尝试在新目录中解压缩源代码。

    开始VS2012 x64 Native Tools Command Prompt: 开始 -> 所有程序 -> Microsoft Visual Studio 2012 -> Visual Studio 工具 -> Open VS2012 x64 Native Tools Command Prompt

    或者跑 %comspec% /k "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" amd64)。

    将目录更改为解压GDAL源的目录:

    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC>cd /D C:\tmp\gdal-1.9.2
    
    D:\trn4\gdal-1.9.2>
    

    使用开发文件构建 GDAL:

    nmake /f makefile.vc MSVC_VER=1700 WIN64=YES
    nmake /f makefile.vc MSVC_VER=1700 WIN64=YES install
    nmake /f makefile.vc MSVC_VER=1700 WIN64=YES devinstall
    

您可以从here 获取您的 MSVC_VER 号码。 GDAL 将被构建并安装到C:\warmerda\bld\

【讨论】:

三个答案的组合对我有用。正如@Thalia 评论的那样,我将变量放在"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat" 上,由于之前的x86 安装遵循@Solkar 评论,我不得不清除构建目录,最后@rutsky 指令起到了作用。 Rutsky的说明比gdal网页上的要清晰得多, @quimnuss 很高兴为您提供帮助!我添加了关于在构建之前清理构建/源目录的注释。如果您有要添加到说明中的内容 --- 随时编辑它们【参考方案2】:

要使用 nmake 命令行构建,我必须从一个命令 shell 运行该命令,该命令外壳设置了适当的变量来构建 64 位。

这是我设置 64 位构建环境所做的:

调用“C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat”amd64

【讨论】:

【参考方案3】:

您应该首先以某种方式向该线程的读者表明,在您完成的 6 次编辑中,您的问题的焦点不止一次发生了变化,正如从 revision history 中可以看到的那样

无论如何: 现在它只是一个批处理与 ide 构建作业的问题;尝试从 VS 导出 makefile

正在出口!不仅仅是在编辑器窗口中打开包原始 makefile.vc!

,将其保存在与包的“makefile.vc”不同的名称下,并在您的批处理中使用它。

【讨论】:

谢谢。我不知道我可以做到这一点 - 从 VS 导出一个生成文件! VS makefile 的唯一改进是设置构建环境——如果我知道的话,我可以更快地解决这个问题。 (对我的帖子的编辑:我尝试使用 VS 构建这一事实,这有助于我追踪问题,并且我将该信息添加到帖子中 - 并没有以任何方式改变问题或问题的范围。确实并不是要迷惑读者……恰恰相反。猜猜不成功。)【参考方案4】:

“我可以在 Win32 中构建。”

在尝试构建 Win64 之前,您是否为 Win32 构建过?

如果有,请参加 http://trac.osgeo.org/gdal/ticket/4636,回复列表底部:

只是提醒其他遇到问题的人.. 我会尝试多看 当我可以的时候进入这个..但与此同时,一个干净的构建不是 真的在做一个“干净”,所以如果你手动删除你的文件 在 64 位构建之前进行 32 位构建。

您也可以尝试在不同的目录中再次简单地提取源代码,以获得干净的树并尝试在那里为 Win64 构建。

【讨论】:

我实际上注意到了即使在不同的 Win32 构建(调试/发布)之间也需要“干净”的问题。我已经运行了“clean”——我有一个 bat 文件,它只调用“start /b /wait nmake -f makefile.vc clean”——我还手动删除了文件……看来我必须在某个地方告诉它否则它是 x64。 请注意,我没有在目标机器和模块机器类型之间遇到冲突 - 如该票证 - 似乎 _WIN64 标记未设置或被忽略。 当您的机器可以帮助您追踪问题时,为什么更愿意花时间手动整理东西?新鲜提取,让机器在为Win64构建的机器上工作,同时喝杯咖啡。 ;) 这正是我想要的——使用一个 bat 文件可以构建所有 4 个平台/配置组合。 :-) ;) 好吧,你也可以解压到 4 个不同的目录,并在一个批次中单独构建每个目录,所以在一个目录中完成所有工作是没有问题的。标准。我想知道你为什么不简单地尝试一下——你不喜欢喝咖啡吗? ;)

以上是关于无法在 x64 中构建 gdal的主要内容,如果未能解决你的问题,请参考以下文章

构建 Python 扩展失败(“kernel32.lib”无法打开 |“x64”与目标机器类型“x86”冲突)

基于本地centos构建gdal2.4.4镜像

链接器错误构建GDAL VS2017

Silverlight OOB或WebHosted可以在x64平台下构建吗?

无法在 Windows 上将 OSG 与 GDAL 一起使用

GDAL 3.1.2 / PROJ 6.2.1 / GCC 10.2 无法处理形状文件