UDK2018 来了----常见编译问题

UDK2018 前一段时间正式 release 了:

https://github.com/tianocore/tianocore.github.io/wiki/UDK2018

编译方法可以在下面的页面找到

https://github.com/tianocore/tianocore.github.io/wiki/UDK2018-How-to-Build

要求 VS2015(我实验用VS2013编译没问题,但是为了避免后续碰到奇怪的问题,建议老老实实用 VS2015)、NASM 2.12.01、Python2.7.x、Openssl (这个应该是第一次正式提出来作为要求,但是实验表明如果只使用 Nt32那么是完全无需安装的)
1. 需要安装 VS2015(特别注意要勾选安装 VC 编译器和 WDK)
2. 安装 Python2.7.14(特别注意在安装界面选择将 Python 加入 Path)
3. 安装 Nasm(特别注意他默认的安装路径不是 c:\Nasm, 需要安装之后手工拷贝到这个目录下)
4. 解压edk2-vUDK2018.tar到 c:\UDK2018
5. 在 edksetup.bat 中加入下面的语句
a. Path c:\nasm;%path%
b. Set PYTHON_HOME=c:\python27
6. 解压edk2-BaseTools-win32-master到 BaseTools\Win32下面
7. 打开“VS2015 x64 Native Tools Command Prompt”。运行一次 edksetup.bat 之后运行 build。这样的编译会导致错误,但是能够在 conf\下面生成我们需要的 Target.bat 在这个文件中找到 TOOL_CHAIN_TAG = MYTOOLS ,修改为TOOL_CHAIN_TAG = VS2018x86,接下来就可使用下面的方法开始编译
a. 输入 edksetup.bat - -nt32
b. Build –a X64 或者 build –a IA32
c. Build run 即可运行 NT32 模拟环境

如果你的运气好,那么上述配置完成之后就可以正常使用 UDK2018 了。如果你的运气不好,还可能像我这样碰到下面的错误:
GenFds...
: error C0DE: Tools code failure
Please send email to edk2-devel@lists.01.org for help, attaching following call stack trace!

Traceback (most recent call last):
File "GenFds\GenFds.py", line 228, in main
File "c:\Users\Public\Documents\BuildPool\BaseTools\build\Source\Python\Workspace\WorkspaceDatabase.py", line 164, in __init__
File "c:\Users\Public\Documents\BuildPool\BaseTools\build\Source\Python\Common\LongFilePathOs.py", line 25, in remove
WindowsError: [Error 32] The process cannot access the file because it is being used by another process: '\\\\?\\c:\\edk2-vudk2018\\conf\\.cache\\build.db'

Exception AttributeError: "'WorkspaceDatabase' object has no attribute 'Conn'" in > ignored
build...
: error 7000: Failed to execute command
GenFds -f c:\edk2-vudk2018\Nt32Pkg\Nt32Pkg.fdf --conf=c:\edk2-vudk2018\conf -o c:\edk2-vudk2018\Build\NT32IA32\DEBUG_VS2015x86 -t VS2015x86 -b DEBUG -p c:\edk2-vudk2018\Nt32Pkg\Nt32Pkg.dsc -a IA32 -D "EFI_SOURCE=c:\\edk2-vudk2018\\edkcompatibilitypkg" -D "EDK_SOURCE=c:\\edk2-vudk2018\\edkcompatibilitypkg" -D "TOOL_CHAIN_TAG=VS2015x86" -D "TOOLCHAIN=VS2015x86" -D "TARGET=DEBUG" -D "FAMILY=MSFT" -D "WORKSPACE=c:\\edk2-vudk2018" -D "EDK_TOOLS_PATH=c:\\edk2-vudk2018\\basetools" -D "ARCH=IA32" -D "ECP_SOURCE=c:\\edk2-vudk2018\\edkcompatibilitypkg" [C:\edk2-vUDK2018]

直接执行最后那一段出现问题的批处理是没问题的。就是说,在编译过程中 GenFds在访问 build.db 的时候会出现问题。顺便多说一句,很多年前我碰到过UEFI编译环境中的这支文件和公司杀毒软件冲突的情况。编译过程需要访问的这个文件被杀毒软件锁定导致编译无法继续。最诡异的是这个错误是随机出现的。最终只能更换到未安装杀毒软件的机器上编译,最终和杀毒软件厂商沟通,前后花了6个月才解决。因此,出现这样的问题非常令人头痛。
仔细观察得知执行的 GenFds 是位于\BaseTools\Bin\Win32下面的GenFds.exe,这是Python编译生成的 EXE。此外在\BaseTools\BinWrappers\WindowsLike 下面还存在GenFds.bat。它内容如下:

@setlocal
@set ToolName=%~n0%
@%PYTHON_HOME%\python.exe %BASE_TOOLS_PATH%\Source\Python\%ToolName%\%ToolName%.py %*

意思就是说,直接调用 Python去执行 GenFds.py。因此,可以将\BaseTools\Bin\Win32\GenFds.exe改名为GenFds.LABZ。然后把\BaseTools\BinWrappers\WindowsLike加入Path路径。编译过程中调用 GenFds指令实际执行的是 GenFds.bat。具体修改方法是在 Edksetup.bat 中加入下面的语句

path c:\nasm;BaseTools\BinWrappers\WindowsLike;%path%
set PYTHON_HOME=c:\python27;

最终可以保证编译正常。如果你在使用过程中碰到了 UDK2018 的问题,不妨在下面给我留言。

=============================================================

2018年6月11日

前面提到的“需要安装 VS2015(特别注意要勾选安装 VC 编译器和 WDK)” 其中应该是 SDK

2019年1月24日

最近在编译 AppPkg 的时候(Build NTPkg 无问题)遇到如下错误

c:\buildbs\UDK\StdLib\Include\sys/EfiCdefs.h(342): error C2220: warning treated as error - no 'object' file generated
c:\buildbs\UDK \StdLib\Include\sys/EfiCdefs.h(342): warning C4117: macro name 'STDC_HOSTED' is reserved, '#define' ignored

检查代码 \StdLib\Include\sys\EfiCdefs.h 有如下定义

// Keep compiler quiet about casting from smaller to larger types
#pragma warning ( disable : 4306 )

#define STDC 1
#define STDC_VERSION 199409L
#define STDC_HOSTED 1 //这个定义导致问题

删除 STDC_HOSTED 定义,或者添加如下编译指令都可以修复这个问题

// Keep compiler quiet about casting from smaller to larger types
#pragma warning ( disable : 4306 )
#pragma warning ( disable : 4117 )

#define STDC 1
#define STDC_VERSION 199409L
#define STDC_HOSTED 1

《UDK2018 来了----常见编译问题》有28个想法

  1. 在进行build AppPkg中的Main时出现STDC_HOSTED 的问题,将其屏蔽后,出现了如下问题:
    c:\myworkspace\edk2-vudk2018\Build\AouyyxPkg\DEBUG_VS2017\IA32\AouyyxPkg\Main\main\OUTPUT\static_library_files.lst
    LibGdtoa.lib(ldtoa.obj) : error LNK2001: 无法解析的外部符号 ___fpclassifyd
    c:\myworkspace\edk2-vudk2018\Build\AouyyxPkg\DEBUG_VS2017\IA32\AouyyxPkg\Main\main\DEBUG\main.dll : fatal error LNK1120: 1 个无法解析的外部命令
    NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\link.exe"”: 返回代码“0x460”
    Stop.

    希望能帮忙解下惑

          1. 我根据UEFI原理与编程,编译最开始的UEFI MAIN 和Shell Main都没有问题,目前就编译StdLib出现问题。
            您说的201903是最新出的EDK2吗

          2. 我上午装了一下 VS2017 有点问题,没法编译,回头还得重新下。那个 201903 是最新的 EDK2 推荐你用,我感觉比 2018 的两个版本都好用。

  2. 請問再Build MdeModulePkg 的時候有遇過下面的問題嗎?? RamDisk 少了東西 但是其他的pKG 是可以BUILD 成功的 可否分享您的經驗? 謝謝
    Building ... d:\udk2018\udk2018\MdeModulePkg\Universal\SmmCommunicationBufferDxe\SmmCommunicationBufferDxe.inf [X64]
    Building ... d:\udk2018\udk2018\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe.inf [X64]
    Trim --asl-file -o d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.i -i d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\inc.lst d:\udk2018\udk2018\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDisk.asl
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\x86_amd64\cl.exe" /nologo /E /C /FIAutoGen.h /Id:\udk2018\udk2018\MdeModulePkg\Universal\Disk\RamDiskDxe /Id:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\DEBUG /Id:\udk2018\udk2018\MdePkg /Id:\udk2018\udk2018\MdePkg\Include /Id:\udk2018\udk2018\MdePkg\Include\X64 /Id:\udk2018\udk2018\MdeModulePkg /Id:\udk2018\udk2018\MdeModulePkg\Include /Id:\udk2018\udk2018\MdeModulePkg\Universal\Disk\RamDiskDxe d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.i > d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.iii
    RamDisk.i
    Trim --source-code -l -o d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.iiii d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.iii
    "C:\ASL\iasl.exe" -pd:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.aml d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe\OUTPUT\.\RamDisk.iiii
    系統找不到指定的路徑。
    NMAKE : fatal error U1077: '"C:\ASL\iasl.exe' : 傳回碼 '0x1'
    Stop.

    build.py...
    : error 7000: Failed to execute command
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\nmake.exe /nologo tbuild [d:\udk2018\udk2018\Build\MdeModule\DEBUG_VS2015x86\X64\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe]

    build.py...
    : error F002: Failed to build module
    d:\udk2018\udk2018\MdeModulePkg\Universal\Disk\RamDiskDxe\RamDiskDxe.inf [X64, VS2015x86, DEBUG]

  3. 請問您有遇過以下問題嗎?
    Architecture(s) = IA32
    Build target = DEBUG
    Toolchain = VS2015x86

    Active Platform = d:\udk2018\udk2018\Nt32Pkg\Nt32Pkg.dsc
    Flash Image Definition = d:\udk2018\udk2018\Nt32Pkg\Nt32Pkg.fdf

    Processing meta-data ........ done!
    Building ... d:\udk2018\udk2018\MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLib.inf [IA32]
    Building ... d:\udk2018\udk2018\MdePkg\Library\PeiServicesLib\PeiServicesLib.inf [IA32]
    系統找不到指定的路徑。

    build.py...
    : error 7000: Failed to execute command
    Vc\bin\nmake.exe /nologo tbuild [d:\udk2018\udk2018\Build\NT32IA32\DEBUG_VS2015x86\IA32\MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLib]

    build.py...
    : error 7000: Failed to execute command
    Vc\bin\nmake.exe /nologo tbuild [d:\udk2018\udk2018\Build\NT32IA32\DEBUG_VS2015x86\IA32\MdePkg\Library\PeiServicesLib\PeiServicesLib]

    build.py...
    : error F002: Failed to build module
    d:\udk2018\udk2018\MdePkg\Library\PeiMemoryAllocationLib\PeiMemoryAllocationLib.inf [IA32, VS2015x86, DEBUG]

    - Failed -
    Build end time: 15:41:39, Apr.08 2020
    Build total time: 00:00:09

  4. Traceback (most recent call last):
    File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in
    exec(code, m.__dict__)
    File "GenFds\GenFds.py", line 24, in
    ValueError: Attempted relative import in non-package

  5. Traceback (most recent call last):
    File "C:\Python27\lib\site-packages\cx_Freeze\initscripts\Console.py", line 27, in
    exec(code, m.__dict__)
    File "GenFds\GenFds.py", line 24, in
    ValueError: Attempted relative import in non-package

    build...
    : error 7000: Failed to execute command
    GenFds -f c:\edk2\Nt32Pkg\Nt32Pkg.fdf --conf=c:\edk2\conf -o c:\edk2\Build\NT32IA32\DEBUG_VS2017 -t VS2017 -b DEBUG -p c:\edk2\Nt32Pkg\Nt32Pkg.dsc -a IA32 -D "EFI_SOURCE=c:\\edk2\\edkcompatibilitypkg" -D "EDK_SOURCE=c:\\edk2\\edkcompatibilitypkg" -D "TOOL_CHAIN_TAG=VS2017" -D "TOOLCHAIN=VS2017" -D "TARGET=DEBUG" -D "FAMILY=MSFT" -D "WORKSPACE=c:\\edk2" -D "EDK_TOOLS_PATH=c:\\edk2\\basetools" -D "ARCH=IA32" -D "ECP_SOURCE=c:\\edk2\\edkcompatibilitypkg" [C:\edk2]

  6. 请问为啥会出这种问题啊

    Building ... c:\edk2\MdeModulePkg\Universal\ReportStatusCodeRouter\Pei\ReportStatusCodeRouterPei.inf [IA32]
    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\link.exe" /out:"c:\edk2\Build\NT32IA32\DEBUG_VS2015x86\IA32\SecMain.exe" /base:0x10000000 /pdb:"c:\edk2\Build\NT32IA32\DEBUG_VS2015x86\IA32\SecMain.pdb" /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\\Lib" /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\\PlatformSdk\Lib" /LIBPATH:"%UniversalCRTSdkDir%lib\%UCRTVersion%\ucrt\x86" /LIBPATH:"%WindowsSdkDir%lib\%WindowsSDKLibVersion%\um\x86" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG Kernel32.lib MSVCRTD.lib vcruntimed.lib ucrtd.lib Gdi32.lib User32.lib Winmm.lib Advapi32.lib /EXPORT:InitializeDriver=_ModuleEntryPoint /BASE:0x10000 /ALIGN:4096 /FILEALIGN:4096 /SUBSYSTEM:CONSOLE @c:\edk2\Build\NT32IA32\DEBUG_VS2015x86\IA32\Nt32Pkg\Sec\SecMain\OUTPUT\static_library_files.lst
    Building ... c:\edk2\MdeModulePkg\Universal\StatusCodeHandler\Pei\StatusCodeHandlerPei.inf [IA32]
    Building ... c:\edk2\Nt32Pkg\WinNtOemHookStatusCodeHandlerPei\WinNtOemHookStatusCodeHandlerPei.inf [IA32]
    Building ... c:\edk2\Nt32Pkg\BootModePei\BootModePei.inf [IA32]
    Building ... c:\edk2\Nt32Pkg\StallPei\StallPei.inf [IA32]
    LINK : warning LNK4108: 已指定 /ALIGN 而没有指定 /DRIVER;映像可能不能运行
    LINK : fatal error LNK1181: 无法打开输入文件“ucrtd.lib”
    Building ... c:\edk2\Nt32Pkg\WinNtFlashMapPei\WinNtFlashMapPei.inf [IA32]
    NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\link.exe"”: 返回代码“0x49d”
    Stop.

    build.py...
    : error 7000: Failed to execute command
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\nmake.exe /nologo tbuild [c:\edk2\Build\NT32IA32\DEBUG_VS2015x86\IA32\Nt32Pkg\Sec\SecMain]
    Building ... c:\edk2\MdeModulePkg\Universal\FaultTolerantWritePei\FaultTolerantWritePei.inf [IA32]

    build.py...
    : error F002: Failed to build module
    c:\edk2\Nt32Pkg\Sec\SecMain.inf [IA32, VS2015x86, DEBUG]

    - Failed -
    Build end time: 14:43:38, Apr.13 2020
    Build total time: 00:00:26

  7. 请问这是真么原因啊

    Building ... c:\edk2\Nt32Pkg\StallPei\StallPei.inf [IA32]
    LINK : warning LNK4108: 已指定 /ALIGN 而没有指定 /DRIVER;映像可能不能运行
    LINK : fatal error LNK1181: 无法打开输入文件“ucrtd.lib”
    Building ... c:\edk2\Nt32Pkg\WinNtFlashMapPei\WinNtFlashMapPei.inf [IA32]
    NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\link.exe"”: 返回代码“0x49d”
    Stop.

    build.py...
    : error 7000: Failed to execute command
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\Vc\bin\nmake.exe /nologo tbuild [c:\edk2\Build\NT32IA32\DEBUG_VS2015x86\IA32\Nt32Pkg\Sec\SecMain]
    Building ... c:\edk2\MdeModulePkg\Universal\FaultTolerantWritePei\FaultTolerantWritePei.inf [IA32]

    build.py...
    : error F002: Failed to build module
    c:\edk2\Nt32Pkg\Sec\SecMain.inf [IA32, VS2015x86, DEBUG]

    - Failed -
    Build end time: 14:43:38, Apr.13 2020
    Build total time: 00:00:26

    1. 根据提示是没有找到对应的连接 Lib 导致的。看起来有可能是没有指定 SDK 的路径。建议在虚拟机中试验看看。

  8. 虽然能够构建成功并且进入模拟器,但是构建过程中中间有两段警告,大神知道是什么原因吗??

    LBINK : warning LNK4108: 已指定 /ALIGN 而没有指定 /DRIVER;映像可能不能运行
    uilding ... c:\edk2\Nt32Pkg\BootModePei\BootModePei.inf [IA32]
    LINK : warning LNK4001: 未指定对象文件;已使用库
    正在创建库 c:\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32\SecMain.lib 和对象 c:\edk2\Build\NT32IA32\DEBUG_VS2010x86\IA32\SecMain.exp

发表评论

电子邮件地址不会被公开。 必填项已用*标注