在 Windows 操作系统下编译 LibreOffice 的技巧及提示

    From The Document Foundation Wiki
    This page is a translated version of the page Development/BuildingOnWindows and the translation is 46% complete.
    Outdated translations are marked like this.

    选择主系统和目标系统

    Since 114ed73a7ba56e013e6d7f886798915fb20c0946 (for more information: https://lists.freedesktop.org/archives/libreoffice/2020-September/085869.html), which basically translates to since LibreOffice 7.1, the old configure switch --enable-64-bit was dropped. To explicitly select your architecture, you have to supply the correct configure host triplet:

    • --host=i686-pc-cygwin: target 32-bit Intel / AMD host
    • --host=x86_64-pc-cygwin: target 64-bit AMD / Intel host
    • --host=aarch64-pc-cygwin: target 64-bit ARM host (WIP, but should run in general - see bug tdf#137143)

    For all versions before LibreOffice 7.1, the default build is always 32-bit on Windows and you must explicitly call autogen.sh/configure with --enable-64-bit to get a 64-bit build.

    Otherwise, your build and host system will be the same, detected by the configure script, which is probably what you want anyway.

    Depending on your decision, you must install a Java version, matching the target architecture and bit count.

    Windows Arm64 交叉编译示例(含Java)

    • --host=aarch64-pc-cygwin or --with-distro=LibreOfficeWinArm64
    • --with-build-platform-configure-options=--with-jdk-home=C:/PROGRA~1/Java/JDK-17~1.1
    • --with-jdk-home=c:/lode/jdk-17-ea+25-windows-aarch64

    The first is the installed Oracle x86_64 Java, the 2nd is the unpacked pre-release of the Windows Arm64 OpenJDK Java.

    编译依赖项

    在 Windows 操作系统上编译 LibreOffice 之前,您需要先按照以下步骤设置好编译环境。同时,请务必阅读一般性的编译提示

    安装 Visual Studio

    您需要安装微软的编译/开发工具包 Visual Studio,可从以下位置获取: https://visualstudio.microsoft.com/downloads/

    该工具包有一个免费的“社区版”,包含了编译 LibreOffice 所需的一切。 https://visualstudio.microsoft.com/vs/community/

    当前的 master 分支 (从 LibreOffice 7.0 开始) 需要 Visual Studio 2019 (至少 v16.5 版本) (或者相应的 Visual Studio Build Tools)。

    从 VS 2017 开始,有一个单独的 Build Tools 包,它包含了编译器以及多数的工具链和库,可以不需要安装Visual Studio IDE: https://visualstudio.microsoft.com/downloads/#build-tools-for-visual-studio-2019. Note that this option excludes convenient/efficient debugging experience.

    对于较老的 LibreOffice 版本,需要的 Visual Studio 版本为:

    • LibreOffice 4.4 需要 Visual Studio 2012
    • LibreOffice 5.0 需要 Visual Studio 2013
    • LibreOffice 5.4 需要 Visual Studio 2015
    • LibreOffice 6.2 需要 Visual Studio 2017
    • LibreOffice 6.3 可使用 Visual Studio 2017 或者 2019 编译
    • LibreOffice 7.0 需要 Visual Studio 2019
    • LibreOffice 7.3 可使用 Visual Studio 2019 或者 2022 编译。

    Visual Studio 2019 作为备选可以安装 2017 和 2015 编译器 (VS 2015 / 2017 C++ Buildtools)。唯一缺少的是较老的 C++ 可分发 MSM 包,因此较老的 configure.ac 脚本需要一个小补丁才能编译 MSI 包。

    老版本的 Visual Studio 可从以下位置获取:https://visualstudio.microsoft.com/vs/older-downloads/

    Visual Studio (以及 Visual Studio Build Tools) 2019 至少需要 v16.5 才能用来编译当前的 master 分支。安装时需要勾选 "Desktop development with C++" workload', 并确保下列各项组件均被选中:

    • MSVC v14x - VS 20xx C++ x64/x86 build tools (Latest)
    • C++ core features
    • Windows 10 (or 11) SDK (10.0.xxxxx.x), with SDK version > 10.0.20*
    • Windows Universal C Runtime
    • C++ ATL for v14x build tools (x86 & x64)
    • .NET Framework 4.x SDK (.NET Framework 5.x SDK and later are currently not supported. These don't register their information to registry, don't have csc.exe and they use dotnet command with csc.dll instead for compiling.)
    • C++ 20xx Redistributable MSMs (仅在编译 MSI 安装包时需要)
    • C++ Clang Compiler for Windows (x.x.x)

    If you want to cross-build for ARM64, you have to select the following additional components:

    • MSVC v142 - VS 20xx C++ ARM64 build tools (v14.2x)
    • C++ ATL for v142 build tools (ARM64)

    您可以在 VS 安装包中选择这些选项。

    这些可分发的 MSMs (仅在编译 MSI 安装包时需要) 不是2019或较高版本中 workload 选项的一部分,需要单独从清单中选择。详细信息,请见对 VS 开发者社区中问题的回答: Where MergeModules for 14.20.27404.0 and 14.20.27508?Deprecation of CRT redist MSMs?

    Template:注意

    安装 Java

    不管您使用的是哪个版本的 Visual Studio,您都需要一个

    • Java Development Kit (JDK) 17 或更告版本,见 [1]。如果是位32位 Windows 编译,请确保安装的是32位 SDK;如果是编译64位版本,请确保安装的是64位SDK。(使用 --enable-64-bit 选项)从以下位置下载:adoptopenjdk.net 或者 oracle.com(Oracle 需要登录才能下载),或者 微软官方网站 (Microsoft的OpenJDK构建版不需要登陆).

    需要注意的是,Oracle JDK 仅有64位版本。

    需要说明的是,AdoptOpenJDK 安装包不会自动被检测到,您需要手动为此启用 "JavaSoft (Oracle) 注册表项" 选项。

    In your autogen.input file, point to the path in this way: --with-jdk-home=C:/Program Files/... (don't point to its bin subdirectory, only to the parent directory, like --with-jdk-home=C:/Program Files/Eclipse Adoptium/jdk-21.0.1.12-hotspot).

    If you're cross compiling to 64-bit ARM, you need to provide a different JDK for the build-tools and the target host. While the build-tools will detect the correct JDK eventually, you must use --with-jdk-home=<Arm64 JDK directory> to provide the host JDK. You can override the build JDK by using --with-build-platform-configure-options=--with-jdk-home=<x64 JDK directory>.

    安装 Cygwin 以及其他依赖项

    Template:注意

    安装 Cygwin 的要求

    在 Windows 下,您必须从 www.cygwin.com 安装 Cygwin. 最新的版本应当能正常工作。可以通过uname -a来检测版本号。

    完成这项任务的最简单方式是下载 Cygwin 的 setup-x86.exe (32位) 或者 setup-x86_64.exe (64-位)。

    • 您应当尽可能地使用64位的 Cygwin, 因为这样才不会容易导致 fork() 出现故障(参见 Cygwin FAQ for details)。

    以64位为例:运行 cmd 并切换到下载目录(如果切换目录存在困难,可将 setup-x86_64.exe 从文件管理器拖动到 cmd 命令提示符中,并 复制粘贴下面的命令,从而运行 setup-x86_64.exe 并预先勾选需要的包

      setup-x86_64.exe -P autoconf -P automake -P bison -P cabextract -P doxygen -P flex -P gcc-g++ ^
                    -P gettext-devel -P git -P gnupg -P gperf -P make -P mintty ^
                    -P nasm -P openssh -P openssl -P patch -P perl -P python -P python3 ^
                    -P pkg-config -P rsync -P unzip -P vim -P wget -P zip -P perl-Archive-Zip ^
                    -P perl-Font-TTF -P perl-IO-String
    

    这将启动图形用户界面,并要求您手动选择安装路径等选项。但是,通过命令行传入的这些包会被预先勾选,因此您不必再去手动勾选,只需接受即可。

    注意:Cygwin 的安装路径中不要包含非 ASCII 字符,以避免编译时autogen.sh/configure 出现问题(如果路径中有非 ASCII 字符,请将 Cygwin 安装文件夹移动到其他地方,并更新 Windows 的桌面及开始菜单快捷方式指向)。

    另一种方式是,运行 setup-x86.exe 或者 setup-x86_64.exe,点击 'View' 直到其旁边显示 'Full',从而将包视图模式切换为'Full' 模式,然后手动勾选上述命令中的包。

    如果您升级了 Cygwin, 那么您可能需要运行 rebaseall 命令(如果是首次安装 Cygwin 的话就不需要):

    关闭所有的 Cygwin 终端,运行 c:\cygwin\bin\dash.exe,然后在终端中启动 /bin/rebaseall

    其他依赖项

    安装完 Cygwin 之后,双击桌面上的 Cygwin64 Terminal 快捷方式来打开 Cygwin 的命令行界面,然后执行下述步骤:

    安装 GNU Make

    Win32 版本的 GNU Make 4.0+ 是在编译 LibreOffice 时必须的。

    最简单的是将其放到 /opt/lo/bin 目录中,这样的话 configure 能自动找到它;您也可以使用其他位置,但是需要设置 MAKE 变量。 您可以将 /opt/lo/bin 附加到 PATH 路径中;或者,在每次编译 LibreOffice 时,使用绝对路径 /opt/lo/bin/make (或者其他的您自己选择的位置)来运行 "make"。LibreOffice 无法(而且也不应当)使用 Cygwin 的 /usr/bin/make。

    mkdir -p /opt/lo/bin
    cd /opt/lo/bin
    wget https://dev-www.libreoffice.org/bin/cygwin/make-4.2.1-msvc.exe
    cp make-4.2.1-msvc.exe make
    chmod +x make
    


    安装 ant 和 junit

    您可以将其解压缩到任意位置,不需要安装它。如果您不需要 Junit,那么可以通过 autogen.sh 的 --without-junit 编译选项来禁用它。

    mkdir -p c:/sources
    cd c:/sources
    wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.9.5-bin.tar.bz2
    tar -xjvf apache-ant-1.9.5-bin.tar.bz2
    wget http://downloads.sourceforge.net/project/junit/junit/4.10/junit-4.10.jar
    

    Also works with the combination of junit 4.13,hamcrest 2.2 and Apache Ant 1.10.12

    克隆 LibreOffice 源代码仓库

    注意:源代码应当放到相对较短的路径中,以避免超过文件/路径长度限制,并且目标路径中不能包含空格。

    cd c:/sources
    git clone https://gerrit.libreoffice.org/core libo-core
    
    可选的:创建编译文件夹

    可以 将 LibreOffice 编译到一个单独的文件夹中(而不是您检出的源代码文件夹中)。这样能使得您的源代码目录树保持干净,并使得编译多个版本变得容易。

    如果您想编译到单独的文件夹中,例如 /cygdrive/c/build,那么输入以下命令:

    mkdir c:/build
    cd c:/build
    

    否则,切换到 /cygdrive/c/sources/libo-core 文件夹:

    cd c:/sources/libo-core
    
    配置并编译代码

    现在运行 autugen.sh 以自动生成编译过程中的配置文件:

    c:/sources/libo-core/autogen.sh \
                 --with-external-tar=c:/sources/lo-externalsrc \
                 --with-junit=c:/sources/junit-4.10.jar \
                 --with-ant-home=c:/sources/apache-ant-1.9.5 \
                 --enable-pch --disable-ccache \
                 [可以使用其他的选项,如果您知道自己在做什么 :-) ...]
    

    注意,在Cygwin环境中不推荐使用 ccache,因为它不会带来明显的速度提升。如果您已经在 Cygwin 中安装了 ccache,那么可以在 autogen.sh 中使用 --disable-ccache 来禁用它。

    如果运行 autogen.sh 时它提示找不到某个头文件,那么很有可能是它无法找到您系统中的 Windows SDK,或者找到的是一个损坏的版本。在您安装了多个版本的Visual Studio 的情况下,就可能会发生这种情况,尤其是当您安装了一个 Beta 测试版本的情况下,即便是您已经卸载了它。如果出现这种情况,您可以使用 --with-windows-sdk=7.1A 编译选项(将 7.1A 改为SDK对应的版本),以手动指定未损坏的版本。

    Also, configure.ac used by autoconf internally gives -showIncludes to cl.exe in order to get what prefix is used by the cl.exe for each included header. When the command is run, it may fail to find vcruntime.h used by stdlib.h. Visual Studio users normally use developer console when they use the cl command, where vcvarsall.bat is called to set necessary environment variables, which may be missing when using autoconf.

    您可以将 autogen.sh 后的编译选项保存到 autogen.input 文件中。如果 LibreOffice 源代码的根目录下存在 autogen.input 文件,那么在不带参数运行 autogen.sh 的情况下它会自动去 autogen.input 文件中获取编译选项;在带任何参数运行 autogen.sh 的情况下,就会使用传递给 autogen.sh 的参数,不会使用 autogen.input 中的选项。

    At this point, you might want to consider additional options to pass to autogen with

    $ ./autogen.sh --help

    For example consider adding a Debugging option. Changing some of these options will require to do a full rebuild: e.g., adding --enable-dbgutil. Since the following command make takes a vast quantity of time to run for the first time, you probably would like to save time by specifying the settings you'd need depending on the ultimate goal of your build. In case of doubt, possibly it's good to ask for advice on #libreoffice-dev.

    阅读 autogen.sh 运行完成后的输出提示。如果没有任何的错误或相关警告,那么接下来只需要运行 "make" 就能进行编译了。但在执行 make 之前,确保您的杀毒软件不会带来任何的问题

    /opt/lo/bin/make gb_COLOR=1  # gb_COLOR=1 启用彩色输出。
    


    运行编译好的 LibreOffice

    当编译完成、并且没有错误时,您就可以运行刚刚编译好的全新的 LibreOffice 了。

    instdir/program/soffice.exe
    


    与微软 Visual Studio 项目集成

    The LibreOffice build system can generate project files for some IDEs including -- thanks to Honza Havlíček's excellent work -- Microsoft Visual Studio: (note that this does not allow a full build so you still need to use Cygwin to do full builds)

    Please accept this video. By accepting you will be accessing content from YouTube, a service provided by an external third party.

    YouTube privacy policy

    生成 Visual Studio 的项目文件

    The IDE integration script is written in python3, which is not installed by default (using the lode method), please install it in cygwin before running the make command. After a complete build of LibreOffice was successful, execute the following command to generate a Visual Studio project:

    $ /opt/lo/bin/make vs-ide-integration
    

    If the generation is successful, the resulting solution file LibreOffice.sln will be placed in the root directory of the build and can be opened with Microsoft Visual Studio.

    See Development / IDE / Microsoft Visual Studio for details, including commands used with older branches and known problems.

    为什么要使用 MSVC?

    这是一个经常被问到的问题,通常来自于自由软件热衷者:我们为什么要使用专有编译器,而不是类似 gcc 的自由编译器?

    • ABI backwards compatibility for compiled extensions. There is some resistance to breaking that.
    • So far MSVC produces faster, smaller binaries.
    • There are some features in the code that don't compile with MinGW. They use API that MinGW does not provide headers for etc.
    • There are open questions around how we would run unit tests in a MinGW cross-compilation environment.
    • There are open questions around how well gdb works on Windows; the MSVC C++ debugger is really quite good.

    Autogen 选项

    Something like the following in the autogen.input file is known to produce a working build:

    --disable-odk
    --with-junit=c:/sources/junit-4.10.jar
    --with-ant-home=c:/sources/apache-ant-1.9.5
    

    Of course, change the information behind ='s to fit your needs; set the paths to what you have used when installing various prerequisites.

    You also need to specify the path for ant with --with-ant-home=<cygwin path of ant>.

    使用 Visual Studio 编译64位软件

    A port for 64-bit Windows is working on master with all supported compilers. To build it, use the --enable-64-bit flag to configure on versions older than LibreOffice 7.1.

    针对更老的以及非默认微软编译器的说明

    切换到非默认编译器

    Specify which Visual Studio version to use in case several are installed.

    Depending on the branch, different versions may be supported, for example 2015, 2017 for libreoffice-6-1, and typically the oldest supported one will be picked by default.

    --with-visual-studio=2019
    

    If you want to use Visual Studio 2022, you have to say it explicitly:

    --with-visual-studio=2022
    


    在 Windows 上运行 Glade

    To edit dialogs (.ui files), you need Glade. There is an old version for Windows but it doesn't support all properties that are needed for LibreOffice dialogs.

    So you need to install Glade in Cygwin:

    • Install Glade in Cygwin by running the Cygwin setup, then install the following packages:
    xorg-server, glade, dbus
    • You may have to invoke:
     dbus-uuidgen > /etc/machine-id
    • Add this to your .bashrc:
    export GLADE_CATALOG_SEARCH_PATH=<<span lang="en" dir="ltr" class="mw-content-ltr">path_to_core</span>>/instdir/share/glade
    • Open one Cygwin console and run:
    X -multiwindow
    • Open another Cygwin console and run:
    DISPLAY=:0.0 glade

    That's it, you should now run Glade ≥ 3.18

    Glade 3.20.3 on Windows 10, editing svx/uiconfig/ui/addmodeldialog.ui

    已知的问题

    Cygwin 和 git

    The main problem is the cygwin-git is very slow.

    The alternatives are:

    • Install the win-git from here:

    https://gitforwindows.org/

    (This installs a "Git-Bash Here" in Explorer)

    • Use Windows Subsystem for Linux (WSL) to install a Linux distribution (see e.g.

    https://www.sitepoint.com/wsl2-windows-terminal/

    for how to install distribution and optionally Windows Terminal)

    Here are the times using the same computer and repo and not being the first call:

    git status

    git 版本 时间 [秒]
    cygwin 2.21.0 20
    win 2.22.0 1
    WSL 2.16.0 6

    Git in WSL is slower than git-bash, but it has the advantage of working in a complete Linux environment with all other tools provided by the distribution. You should not mix tools from Cygwin and WSL (i.e. open separate terminals for Cygwin and for WSL).

    NOTE: A mix between different git tools is not always compatible, when you change you should renew (clone) the git repositories.

    Best to configure "autocrlf" before cloning master, to avoid the problem (see below for how to set "autocrlf" to a sensible value)

    文件的可执行权限

    It is desirable to use filemode = false in the [core] section of .git/config, to avoid all files having executable permission in cygwin-git. This setting allows Git to ignore the differences between file modes of files on disk and in index, which is useful with cygwin-git, which sees all files on disk as having executable permission (755 instead of typical 644). However, sometimes you need to add a script file with executable permission, and with the mentioned setting, you would need to use an explicit command to set the permission to the added file:

    git update-index --chmod=+x myfile.sh

    Cygwin 命令行

    You will use Cygwin Bash Shell for the whole build process. You must install all the build dependencies above before starting the shell to run autogen because autogen needs some environment variables to find the tools.

    If you see an error similar to the following when running autogen.sh

       $'\r': command not found
    

    This means that Windows style newline characters are creating issues with the Cygwin Shell. Unfortunately, the default mode for Git for Windows is automatically changing line endings on file checkout. A good way to solve this is to configure git to clone without changing line ending. To do so, give the following command in Cygwin Shell:

       git config core.autocrlf false
    


    “狡猾的应用”超级清单

    如果您遇到了神秘的编译错误、编译速度很慢、或者系统卡死等奇怪的问题,请检查您是否运行了与Cygwin相冲突的应用程序。一些已知的有冲突的程序,见Cygwin常见问题中的这一点

    BitDefender(比特梵德)及其他反病毒及安全工具对编译过程的破坏

    If your build fails with a FileNotFoundError: such as The system cannot find the file specified: '../../../dist/out/bin\\example.exe', there's a good chance your Anti-Virus is quarantining or deleting important files.

    Another potential source of problems is the sample documents (those labeled CVE) that check for known vulnerabilities to ensure they don't reappear again. In the source they are stored encrypted to avoid triggering the warnings, but when the corresponding test is run, the original is created in the temp directory and tools such as BitDefender can flag it.

    If you want to run these tests, disable monitoring of the temporary build-directories <root of repo>\*\pass and C:\cygwin\tmp in your Anti-Virus tool. For Windows 8 and 10 you will need to disable Windows Defender launch - search for and launch 'defender' from the shell.

    You can also use the --disable-cve-tests autogen flag to skip the tests that are known to cause trouble.

    Also note that Anti-Virus tools can slow down your build quite a bit, if you want to build fast you should disable real-time monitoring of the source tree and the temporary files directory C:\cygwin\tmp.

    Norton(诺顿)反病毒软件对编译过程的破坏

    Norton Antivirus and Symantec Endpoint Protection complain about certain files that the build produces. It finds the following files (in a build without "--enable-dbgutil" )

    Malware: Suspicious.Cloud
    D:\bld\rel\workdir\UnpackedTarball\icu\source\bin\genrb.exe*
    Malware: Suspicious.Cloud.5
    D:\bld\rel\workdir\UnpackedTarball\nss\nss\lib\zlib\out\example.exe*
    D:\bld\rel\workdir\UnpackedTarball\nss\dist\out\bin\example.exe* 
    D:\bld\rel\instdir\program\reg4allmsdoc.dll
    D:\bld\rel\instdir\program\sdqsmsi.dll
    D:\bld\rel\instdir\program\sellangmsi.dll
    

    Files with * are needed for the build - exclude them from the virus scan!

    The following files appear with varying names (????) in a release build, so you cannot exclude them from the scan.

    D:\bld\rel\instdir\program\RCX????.tmp
    D:\bld\rel\instdir\program\RCX????.tmp
    D:\bld\rel\instdir\program\RCX????.tmp
    

    Current workaround: Don't do release builds (unless you are allowed/willing to switch off the virus scanner).

    系统 PATH 路径造成的奇怪的编译损坏问题

    If you experience weird build breakage that no one else seems to experience, check your PATH value and try cleaning it. Note that you need to open a new shell and re-run autogen.sh in order for the new system PATH value to take effect in your build. Some people have experienced a build failure in the shell module due to their system PATH including a path to an older OOo installation that had a DLL of the same name as the one that the build uses.

    Windows 自动更新在编译时自动重启系统

    Sometimes Microsoft Windows reboot during compilation. It happens because Windows Update updates operating system and reboot. To stop windows update from command line, you can enter following command in command box:

    C:> net stop wuauserv
    

    It stops a Windows Update service process.

    PDF 数字签名无法通过测试

    On Windows, it can happen, that PDF signing tests are failing:

    [build CUT] xmlsecurity_pdfsigning
    warn:sfx.appl:2956:6324:sfx2/source/appl/app.cxx:193: No DDE-Service possible. Error: 16399
    warn:svl.crypto:2956:6324:svl/source/crypto/cryptosign.cxx:1415: CryptAcquireCertificatePrivateKey failed: Das Zertifikat und der private Schlüssel für die Entschlüsselung wurden nicht gefunden.
    warn:vcl.filter:2956:6324:vcl/source/filter/ipdf/pdfdocument.cxx:846: PDFDocument::Sign: PDFWriter::Sign() failed
    C:/Users/davido/projects/libo/xmlsecurity/qa/unit/pdfsigning/pdfsigning.cxx:174:PDFSigningTest::testPDFAdd assertion failed
    - Expression: aDocument.Sign(aCertificates[0], "test", true)
    

    Solution: Remove expired Own Certificate:

    http://imgur.com/a/NdCxT

    1. Start certmgr
    2. proceed to Own Certificates
    3. Remove expired certificate
    4. Repeat the tests
    5. Done

    短文件名 (8.3 文件名)

    If you get an error like the following one:

    configure: error: converted path "C:/PROG~1/Microsoft SDKs/Windows/v8.1A/bin/NETFX4~1.1TO/" still contains spaces. Short filenames (8.3 filenames) support was disabled on this system?
    Error running configure at ./autogen.sh line 300.
    

    Then ensure 8.3 name creation is enabled. Open the Command Prompt as administrator and run:

    fsutil 8dot3name query c:
    

    Also, check that the conflicting folder (in this case, "Microsoft SDKs") has a corresponding 8.3 filename. For example:

    cd C:\Program Files (x86)\
    dir /x M*
    

    This will print a list of folders beginning with "M" and their associated 8.3 filenames. If "Microsoft SDKs" does not have a short filename, you can rename it to "tmp", then create a new folder "Microsoft SDKs", check that it has a short filename and move the contents of "tmp" to "Microsoft SDKs".

    When choosing a directory in which to install LODE, please use the 8.3 rules. Windows does not correct environment variables, therefore e.g. LODE_HOME will be wrong and will cause problems. Therefore, always clone lode in an 8.3 path such as:

    C:\source\LO\lode
    

    autogen.sh might report that it cannot find mscvc.exe.

    This is caused by the long filename problem as well, but the solution is a bit more work:

    Shift+reset, go to the safe mode, do this:

    fsutil 8dot3name set c: 0
    fsutil file setshortname "Program Files (x86)" PROGS
    fsutil file setshortname "Microsoft Visual Studio 12.0" msvc-12
    fsutil file setshortname "Windows Kits" W~Kits
    

    Correct your PATH variable

    与 MS Windows 的安全及加密有关的问题

    There is a document describing various fixes for Windows Security / Crypto related problems in the Windows Server troubleshoot documentation: https://docs.microsoft.com/en-us/troubleshoot/windows-server/windows-security/windows-security-overview. It has a subsection for Permissions, access control, and auditing.

    ALINK : 错误 AL1078: Error signing assembly -- Access is denied

    Fix: the correct permissions for the MachineKey folder are described in https://docs.microsoft.com/en-us/troubleshoot/windows-server/windows-security/default-permissions-machinekeys-folders. A more elaborated description is in https://odetocode.com/blogs/scott/archive/2020/01/12/solving-access-denied-in-crypto-machine-keys.aspx. It's a bit complex to get right, so check twice.

    Alternative workaround: open the Developer Command Prompt for VS as an administrator, and use sn tool to set `AL.EXE` to use the current user key set to sign assemblies instead of using the machine key set:

    sn -m n
    


    This modifies the following registry keys:

    for 64-bit systems:

    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\StrongName

    for 32-bit systems:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName

    .NET exception occurred: System.IO.IOException: Access is denied

    You may run into this error message while building the cli_uretypes module:

    [build DEP] LNK:Executable/climaker.exe

    [build LNK] Executable/climaker.exe
    LINK : /LTCG specified but no code generation required; remove /LTCG from the link command line to improve linker performance
    [build CLI] cli_uretypes
    > error: .NET exception occurred: System.IO.IOException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
      at: System.Reflection.Emit.ModuleBuilder.SavePEFile(RuntimeModule module, String fileName, Int32 entryPoint, Int32 isExe, Boolean isManifestFile)
      at: System.Reflection.Emit.ModuleBuilder.Save(String fileName, Boolean isAssemblyFile, PortableExecutableKinds portableExecutableKind, ImageFileMachine imageFileMachine)
      at: System.Reflection.Emit.AssemblyBuilder.SaveNoLock(String assemblyFileName, PortableExecutableKinds portableExecutableKind, ImageFileMachine imageFileMachine)
      at: System.Reflection.Emit.AssemblyBuilder.Save(String assemblyFileName, PortableExecutableKinds portableExecutableKind, ImageFileMachine imageFileMachine)
      at: ?A0x8a0098b7.sal_main()
    > dying abnormally...make[1]: *** [E:/master/cli_ure/CliUnoApi_cli_uretypes.mk:14: E:/master/instdir/program/cli_uretypes.dll] Error 1
    make: *** [Makefile:123: cli_ure.build] Error 2
    

    To solve this you need to grant (as Administrator)

    Modify
    

    permission for the Users group to the folder

    C:\ProgramData\Microsoft\Crypto
    

    其他已知问题

    • Paths that include /opt cause problems with some external modules; it is best to avoid having your source tree in /opt; or use --disable-orcus to overcome this.
    • Asian locale builds sometimes fail due to encoding issues in the source code; in these cases, patches to fix those problems are appreciated. Alternatively, configure Windows for a US locale.

    使用 Windows 程序作为您的 git 文本编辑器

    Paths under Cygwin are an endless source of nightmares. This section documents using Notepad++ as your git editor under Cygwin. It assumes you are using the 64-bit version of Notepad++ (adjust the path, if using the 32-bit version).

    Below you will find a wrapper script written by Gene Pavlovsky

    (original gist in GitHub).

    1. Save the script as cygrun.sh into the bin directory in Cygwin's root (so it is in the PATH). When saving the cygrun.sh using Notepad++, do this first to make sure it has Unix line endings: from the "Edit" menu, select "EOL Conversion" -> "UNIX (LF)".
    2. In a Cygwin shell inside the bin directory, give this command to create a symbolic link:
    ln -s cygrun.sh cygrun
    1. Give this command in your home directory:
    git config core.editor "cygrun -w 'C:/Program Files/Notepad++/notepad++.exe' --wait"

    or alternatively edit your .gitconfig to contain this editor block:

    editor = cygrun -w 'C:/Program Files/Notepad++/notepad++.exe' --wait

    The --wait is important, as it forces git to wait until you close the file.

    Bonus: if you want to define Notepad++ as the default editor of your shell and also access it through a handy "np" alias, add these to the .bashrc file in your home directory:

    export EDITOR="'c:/Program Files/Notepad++/notepad++.exe'"
    alias np="'c:/Program Files/Notepad++/notepad++.exe'"

    Remember to be very careful with the line endings, when creating new files and use the Edit -> EOL Conversion.

    The cygrun script:

    #!/bin/bash
    #
    # Run a program, converting UNIX and Windows format path arguments.
    #
    # Install in Cygwin's `bin` dir or elsewhere in your path. 
    # Create a symlink for convenience: `ln -s cygrun.sh cygrun`.
    #
    # Use `cygrun -w windows-program unix-path ...` to run Windows programs (e.g. from UNIX software).
    # E.g., in my .gitconfig core.editor is set to `cygrun -w 'C:/Program Files/Notepad2/Notepad2.exe'`.
    #
    # Use `cygrun [-u] unix-program windows-path ...` to run Cygwin programs (e.g. from Windows software).
    # Usually not needed since Cygwin translates Windows paths automatically (e.g. `ls 'C:\Windows'` works).
    # Still it can be useful in case a Windows program might produce paths that mix backslashes and forward slashes,
    # e.g. in Apache Ant `${dist.dir}/file` evaluates to `C:\path\to\project\dist/file`, which Cygwin won't
    # translate automatically. So, to deploy the file, I use `cygrun -u scp ${dist.dir}/file ${deploy.url}`.
    #
    # Use the `-b` option to detach from tty, run the process in background, and return immediately.
    #
    # There is currently a limitation on passing non-path arguments to a program. Since there is no way
    # to automatically distinguish path arguments from non-path arguments, all of the arguments are passed
    # to `cygpath`. As long as non-path arguments don't contain `/` or `\` characters, and `-a` or `-C`
    # options are not used, `cygpath` will return the arguments unmodified - no problem.
    # Due to this, the `-a` and `-C` options are disabled at the moment.
    # TODO: Add an option allowing to specify index positions of path arguments (comma-separated, support ranges).
    #
    # Most of the options are passed as is to `cygpath`, which is used for path conversion.
    
    set -e -o pipefail
    
    usage() {
      local code=${1:-2}
      test $code -ne 0 && exec >&2
      
      echo "Usage: $(basename "$0" .sh) [options] program [argument]..."
      echo
      echo 'Run a program, converting UNIX and Windows format path arguments.'
      echo
      echo 'Output type options:'
      echo
      echo '  -d, --dos             print DOS (short) form of NAMEs (C:\PROGRA~1\)'
      echo '  -m, --mixed           like --windows, but with regular slashes (C:/WINNT)'
      echo '  -u, --unix            (default) print Unix form of NAMEs (/cygdrive/c/winnt)'
      echo '  -w, --windows         print Windows form of NAMEs (C:\WINNT)'
      echo
      echo 'Path conversion options:' 
      echo
      echo '  -U, --proc-cygdrive   Emit /proc/cygdrive path instead of cygdrive prefix'
      echo '                        when converting Windows path to UNIX path.'
      echo '  -c, --codepage CP     print DOS, Windows, or mixed pathname in Windows'
      echo '                        codepage CP.  CP can be a numeric codepage identifier,'
      echo '                        or one of the reserved words ANSI, OEM, or UTF8.'
      echo '                        If this option is missing, cygrun defaults to the'
      echo '                        character set defined by the current locale.'
      echo
      echo "Other 'cygpath' options:"
      echo
      echo '  -f, --file FILE       read FILE for input; use - to read from STDIN'
      echo "  -o, --option          read 'cygpath' options from FILE as well (for use with --file)"
      echo '  -h, --help            output usage information and exit'
      echo
      echo 'Run options:'
      echo
      echo '  -b, --background      run in a new session'
      echo '  -n, --dry-run         print the command that would be executed, and exit'
      
      exit $code
    }
    
    run() {
      local -n _run_args=$2
      if test "$dry_run"; then
        test "$chdir" && printf 'cd %s\n' "$chdir"
        printf '%s\n' "$1 ${_run_args[*]}"
      else
        test "$chdir" && cd -- "$chdir"
        if test "$background"; then
          setsid "$1" "${_run_args[@]}" </dev/null &>/dev/null &
        else
          exec "$1" "${_run_args[@]}"
        fi
      fi
    }
    
    declare opts fileopts chdir background dry_run
    while test $# -gt 0; do
      case $1 in
        -d|--dos|-u|--unix|-m|--mixed|-w|--windows|-U|--proc-cygdrive|-o|--option)
          opts="${opts} $1"
        ;;
        -C|--codepage|-f|--file)
          opts="${opts} $1 $2"
          shift
        ;;
        -f|--file)
          fileopts=1
          opts="${opts} -i $1 $2"
          shift
        ;;
        -b|--background)
          background=1
        ;;
        -n|--dry-run)
          dry_run=1
        ;;
        -h|--help)
          usage 0
        ;;
        --)
          shift
          break
        ;;
        -*)
          script="$(basename "$0" .sh)"
          echo "$script: Unknown option: $1" >&2
          echo "Try '$script --help' for more information." >&2
          exit 2
        ;;
        *)
          break
        ;;
      esac
      shift
    done
    test "$chdir" && opts="$opts -a"
    
    program=$1
    test "$program" || usage
    shift
    
    declare -a args
    test $# -gt 0 -o "$fileopts" && mapfile -t args < <(cygpath $opts -- "$@" || exit 1)
    run "$program" args


    另请参考