分类
代码开发

如何编译 LibreOffice

本文介绍了在 Fedora 32 linux 操作系统下从源代码编译 LibreOffice 并启用中文用户界面的方法。

一、安装编译环境依赖

$ sudo dnf builddep libreoffice

$ sudo dnf install ccache  # 安装 ccache,从而能够在重新编译时复用之前编译的缓存以加速编译
$ ccache -M 10G  # 将 ccache 缓存大小限制设置为 10G
$ ccache --set-config=cache_dir=</path/to/ccache_dir> # 若空间不足,可将 ccache 的缓存目录设置为其他的位置(比如挂载的其他分区目录)

$ sudo dnf install patch avahi-devel  # builddep 没有安装好这两个编译依赖的包
$ sudo dnf install fakeroot rpm-build # 若您需要将编译结果打包为 rpm 格式(即在autogen.input中启用--with-package-format=rpm),则需要安装这两个包

二、克隆源代码及子模块(git clone)

首先克隆主代码。此处克隆 libreoffice-7-0 分支。克隆时,因为我只需要最新的源代码(不需要历次的所有commit),因此使用了depth=1选项。

$ git clone --depth=1 --branch libreoffice-7-0 git://go.suokunlong.cn/lo/core ./libreoffice-7-0
正克隆到 './libreoffice-7-0'…
remote: 枚举对象: 120360, 完成.
remote: 对象计数中: 100% (120360/120360), 完成.
remote: 压缩对象中: 100% (86011/86011), 完成.
remote: 总共 120360 (差异 46040),复用 87907 (差异 32504)
接收对象中: 100% (120360/120360), 272.72 MiB | 9.36 MiB/s, 完成.
处理 delta 中: 100% (46040/46040), 完成.
正在更新文件: 100% (120889/120889), 完成.

然后,配置子模块。若不进行如下配置,则若启用中文用户界面选项,会默认去git.libreoffice.org克隆子模块代码,速度较慢并且无法观察克隆进展:

$ cd libreoffice-7-0/
$ git submodule init
子模组 'dictionaries'(https://git.libreoffice.org/dictionaries)已对路径 'dictionaries' 注册
子模组 'helpcontent2'(https://git.libreoffice.org/help)已对路径 'helpcontent2' 注册
子模组 'translations'(https://git.libreoffice.org/translations)已对路径 'translations' 注册

我们编译时只需要 translations 子模块,没有启用帮助及词典,因此到 .git/config 中将 dictionaries 和 helpcontent2 两个子模块删除。然后,将translations模块的url修改为国内镜像地址(比如 git://go.suokunlong.cn/lo/translations),以加快克隆速度。

然后,抓取子模块。此处使用 –depth=1 选项以只获取最新的翻译字符串,并且使用 –progress 选项以显示克隆进展。

$ git submodule update --progress --depth=1
正克隆到 '/home/suokunlong/build/lo/libreoffice-7-0/translations'...
remote: 枚举对象: 45290, 完成.        
remote: 对象计数中: 100% (45290/45290), 完成.        
remote: 压缩对象中: 100% (11030/11030), 完成.        
remote: 总共 45290 (差异 22278),复用 37455 (差异 14997)        
接收对象中: 100% (45290/45290), 107.72 MiB | 7.20 MiB/s, 完成.
处理 delta 中: 100% (22278/22278), 完成.
remote: 总共 0 (差异 0),复用 0 (差异 0)
remote: 枚举对象: 14403, 完成.
remote: 对象计数中: 100% (14403/14403), 完成.
remote: 压缩对象中: 100% (3316/3316), 完成.
remote: 总共 11565 (差异 5892),复用 9773 (差异 4229)
接收对象中: 100% (11565/11565), 89.61 MiB | 3.06 MiB/s, 完成.
处理 delta 中: 100% (5892/5892), 完成 155 个本地对象.
来自 git://go.suokunlong.cn/lo/translations
 * branch              4a12b40c8751323705d82539be43d04990f934a9 -> FETCH_HEAD
子模组路径 'translations':检出 '4a12b40c8751323705d82539be43d04990f934a9'

最后,获取 external_tarballs. 这是 libreoffice 在编译时使用的第三方库等包,默认是从境外服务器去抓取,速度很慢。我已将常用的包放在了境内服务器,您需要从以下位置下载。可以使用下载器一次性全部下载,或者在下面的 make 阶段根据终端输出再去仅下载需要的文件。下载的文件请放置到下列autogen.input中设定的路径下。

https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs/

三、配置编译选项(autogen.input)

在克隆的源代码根目录下建立 autogen.input 文件,内容如下:

# 以下选项复制自 distro-configs 下的 LibreOfficeLinux.conf,
# 并对个别选项进行了修改
--with-system-dicts
--without-myspell-dicts
--with-system-zlib
--without-system-poppler
--without-system-openssl
--without-system-libpng
--without-system-libxml
--without-system-jpeg
--without-system-jars
--without-system-postgresql
--without-junit
--without-help
--without-helppack-integration
--with-linker-hash-style=both
--without-fonts
--with-external-thes-dir=/usr/share/mythes
--with-external-hyph-dir=/usr/share/hyphen
--with-external-dict-dir=/usr/share/hunspell
--enable-avahi
--enable-dbus
--enable-extension-integration
--disable-odk
--enable-gtk3-kde5
--enable-kf5
--enable-gstreamer-1-0
--enable-evolution2
--enable-gio
--enable-scripting-beanshell
--enable-scripting-javascript
--enable-ext-wiki-publisher
--enable-ext-nlpsolver
--enable-epm
--enable-python=internal
--disable-online-update
--enable-breakpad
--disable-dconf
--enable-mergelibs

# 启用简体中文及繁体中文支持,多个语言之间以空格隔开
--with-lang=zh-CN zh-TW

--without-doxygen

--with-external-tar=/home/suokunlong/build/lo/external_tarballs


# 若要启用调试功能,请启用此选项
#--enable-dbgutil

# 部分功能需要用到 java JDK,若需要请自行配置
--without-java

四、编译(autogen.sh && make build-nocheck)

在源代码根目录下运行 autogen.sh。该脚本会调用 autogen.input中定义的编译选项。

./autogen.sh

若提示缺少某个包,则很可能是需要手动安装这个包的devel版本。若没有提示错误,则运行make命令进行编译。以下命令使用了 build-nocheck,以跳过耗时的编译后检查(比如单元测试):

make build-nocheck

此时,若提示正在从 dev-www.libreoffice.org 下载各种包,但墙内速度很慢的情况下,可以按下 Ctrl-C键中断,然后手动从浏览器中下载(见以上第二部分最后的链接)并放入 –with-external-tar 编译选项指定的目录。也可以从其他任何地方下载,比如提示下载 Python-3.7.7.tar.xz 时也可以从 http://npm.taobao.org/mirrors/python/3.7.7/ 下载。

编译比较耗时,安装官方wiki上的说法,耗时约 = 8小时 / cpu核心数。

编译完成后,执行 .instdir/program/soffice 即可运行。若需要 deb 或 rpm 包,可在autogen.input中加入 “–with_package_format=rpm deb” 然后编译,生成的安装包在 workdir/installation中。

Kevin Suo

会计一枚;LibreOffice 简体中文 UI 及网站本地化翻译;wiki贡献者。

“如何编译 LibreOffice”上的30条回复

你好,我在执行完./autogen.sh后,执行make build-nocheck,make发生错误

C:\PROGRA~2\MICROS~1.0\VC\bin\cl.exe -arch:SSE /Fotmp32dll\uplink.obj -Iinc32 -Itmp32dll -MD -Ox -O2 -Ob2 -DOPENSSL_THREADS -DDSO_WIN32 -W3 -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -DOPENSSL_BN_ASM_
PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DOPENSSL_USE_APPLINK -I. -DOPENSSL_NO_IDEA -DOPENSSL_NO_RC5 -DOPENSSL_NO_MD
2 -DOPENSSL_NO_SSL2 -DOPENSSL_NO_KRB5 -DOPENSSL_NO_JPAKE -DOPENSSL_NO_WEAK_SSL_CIPHERS -DOPENSSL_NO_STATIC_ENGINE /Zi /Fdtmp32dll/lib -D_WINDLL -c ms\uplink.c
uplink.c
ms\uplink.c(12): fatal error C1083: □޷□□򿪰 □□□□ļ□: □□windows.h□□: No such file or directory
NMAKE : fatal error U1077: □□C:\PROGRA~2\MICROS~1.0\VC\bin\cl.exe□□: □□□ش□□롰0x2□□
Stop.
D:/LibreOfficeComplie/5.4.7.2/external/openssl/ExternalProject_openssl.mk:59: recipe for target ‘D:/LibreOfficeComplie/5.4.7.2build/workdir/ExternalProject/openssl/build’ failed
make[1]: *** [D:/LibreOfficeComplie/5.4.7.2build/workdir/ExternalProject/openssl/build] Error 1
make[1]: *** Waiting for unfinished jobs….
[javac] D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\beanshell\build.xml:182: warning: ‘includeantruntime’ was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] □□□□: Դ□□□а□ 1.6 □□ҪĿ□귢□а□ 1.6

BUILD FAILED
D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\beanshell\build.xml:182: Compile failed; see the compiler error output for details.

Total time: 1 second
D:/LibreOfficeComplie/5.4.7.2/external/beanshell/ExternalProject_beanshell.mk:17: recipe for target ‘D:/LibreOfficeComplie/5.4.7.2build/workdir/ExternalProject/beanshell/build’ failed
make[1]: *** [D:/LibreOfficeComplie/5.4.7.2build/workdir/ExternalProject/beanshell/build] Error 1
[javac] D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\hsqldb\build\build.xml:143: warning: ‘includeantruntime’ was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] □□□□: [options] δ□□ -source 6 һ□□□□□□□□□□□□·□□
[javac] □□□□: [options] Դֵ6□ѹ□ʱ, □□□□δ□□□□□з□□а□□□ɾ□□
[javac] □□□□: [options] Ŀ□□ֵ1.6□ѹ□ʱ, □□□□δ□□□□□з□□а□□□ɾ□□
[javac] □□□□: [options] Ҫ□□□□□й□□ѹ□ʱѡ□□□ľ□□□, □□ʹ□□ -Xlint:-options□□
[javac] ע: D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\hsqldb\src\org\hsqldb\util\CodeSwitcher.javaʹ□□□□δ□□□□□□□򲻰 □ȫ□IJ□□□□□
[javac] ע: □й□□□ϸ□□Ϣ, □□ʹ□□ -Xlint:unchecked □□□±□□롣
[javac] 4 □□□□□□
[javac] D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\hsqldb\build\build.xml:342: warning: ‘includeantruntime’ was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] □□□□: [options] δ□□ -source 6 һ□□□□□□□□□□□□·□□
[javac] □□□□: [options] Դֵ6□ѹ□ʱ, □□□□δ□□□□□з□□а□□□ɾ□□
[javac] □□□□: [options] Ŀ□□ֵ1.6□ѹ□ʱ, □□□□δ□□□□□з□□а□□□ɾ□□
[javac] □□□□: [options] Ҫ□□□□□й□□ѹ□ʱѡ□□□ľ□□□, □□ʹ□□ -Xlint:-options□□
[javac] ע: D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\hsqldb\src\org\hsqldb\store\ValuePoolHashMap.javaʹ□û򸲸 □□□□ѹ□ʱ□□ API□□
[javac] ע: □й□□□ϸ□□Ϣ, □□ʹ□□ -Xlint:deprecation □□□±□□롣
[javac] 4 □□□□□□
[javac] D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\hsqldb\build\build.xml:353: warning: ‘includeantruntime’ was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] □□□□: [options] δ□□ -source 6 һ□□□□□□□□□□□□·□□
[javac] □□□□: [options] Դֵ6□ѹ□ʱ, □□□□δ□□□□□з□□а□□□ɾ□□
[javac] □□□□: [options] Ŀ□□ֵ1.6□ѹ□ʱ, □□□□δ□□□□□з□□а□□□ɾ□□
[javac] □□□□: [options] Ҫ□□□□□й□□ѹ□ʱѡ□□□ľ□□□, □□ʹ□□ -Xlint:-options□□
[javac] D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\hsqldb\src\org\hsqldb\lib\java\JavaSystem.java:163: □□□□: □Ҳ□□□□□□□
[javac] System.runFinalizersOnExit(true);
[javac] ^
[javac] □□□□: □□□□ runFinalizersOnExit(boolean)
[javac] λ□□: □□ System
[javac] ע: ijЩ□□□□□ļ□ʹ□û򸲸 □□□□ѹ□ʱ□□ API□□
[javac] ע: □й□□□ϸ□□Ϣ, □□ʹ□□ -Xlint:deprecation □□□±□□롣
[javac] ע: ijЩ□□□□□ļ□ʹ□□□□δ□□□□□□□򲻰 □ȫ□IJ□□□□□
[javac] ע: □й□□□ϸ□□Ϣ, □□ʹ□□ -Xlint:unchecked □□□±□□롣
[javac] 1 □□□□□□
[javac] 4 □□□□□□

BUILD FAILED
D:\LibreOfficeComplie\5.4.7.2build\workdir\UnpackedTarball\hsqldb\build\build.xml:353: Compile failed; see the compiler error output for details.

Total time: 6 seconds
D:/LibreOfficeComplie/5.4.7.2/external/hsqldb/ExternalProject_hsqldb.mk:17: recipe for target ‘D:/LibreOfficeComplie/5.4.7.2build/workdir/ExternalProject/hsqldb/build’ failed
make[1]: *** [D:/LibreOfficeComplie/5.4.7.2build/workdir/ExternalProject/hsqldb/build] Error 1

我只在Linux下编译过,Windows下不熟。你贴的错误提示太多太乱,能否从出错的地方整理一下发出来?另外,重要的是,你在编译时使用了什么样的编译选项(autogen.input 或 autogen.sh后的选项)?

我的编译选项是../5.4.7.2/autogen.sh \
–with-external-tar=/cygdrive/d/LibreOfficeComplie/lo-externalsrc \
–with-junit=/cygdrive/d/LibreOfficeComplie/Junit/junit-4.10.jar \
–with-ant-home=/cygdrive/d/LibreOfficeComplie/apache-ant-1.9.5 \
–with-visual-studio=2015 \
–with-windows-sdk=7.1A \
–with-jdk-home=/cygdrive/e/Java/jdk-11.0.9.1+1 \
–enable-pch –disable-debug –disable-ccache –disable-odk –without-helppack-integration
不过在配置完以后会有个WARNING : No –with-ucrt-dir not specified or dlls not found – installer will have runtime dependency
make的时候报错是ms\uplink.c(12): fatal error C1083:windows.h: No such file or directory

> D:/LibreOfficeComplie/5.4.7.2/[…]

你这是在编译 git HEAD 还是在编译 5.4.7.2 版本?

那这篇文章的内容并不适合你。理论上来说发布版的源码里有生成好的 configure 等脚本,不需要再运行 autogen.sh。

而且 5.4.7 版本也太旧了,如果有符合要求的 Windows 7 和 Visual Studio 2019 version 16.4 以上版本的编译系统,建议还是从 git HEAD 或是最新版本 7.1.x 开始尝试。

据我所知,LibreOffice是通过autogen.sh脚本生成编译所在机器的configure文件,因此编译前必须运行autogen.sh,否则make找不到需要编译的目标。只不过,我没有在win下编译过,因此帮不上忙。如果有谁试过可以看一下。也可以去看看wiki页面,或者到开发者irc频道寻求帮助。

也可以试试libreoffice-7-1分支能否成功编译,这个分支已经很稳定了而且有很多性能提升。

我刚刚将 wiki 上的在 Windows 下编译的页面主要部分进行了翻译,你可以对照着看一下,也许能找到解决办法。根据我的理解,很可能是 Visual Studio 版本配置的问题。

对于 LibreOffice 的编译和构建而言,macOS 和 iOS 是完全不同的两个体系。
在 macOS 上构建用于台式或笔记本式电脑的 LibreOffice 应用程序,已经很成熟了。官方有支持 macOS 的编译好的软件包可供下载,构建系统方面的支持就在官方源码仓库里,官方维基也有简单的编译指南:https://wiki.documentfoundation.org/Development/BuildingOnMac
在 iOS 上构建用于手机的 LibreOffice App,是非常新的东西,官方并不支持。目前据我所知只有 Collabora 公司一家在做这件事,他们有相应的 App 供用户下载,但具体构建系统支持的代码在哪里,有没有相应的文档,我都不太清楚。

checking for bogus pkg-config… configure: error: yes, from unknown origin. This *will* break the build. Please modify your PATH variable so that /usr/local/bin/pkg-config is no longer found by configure scripts.
configure: error: Running configure script for BUILD system failed, see CONF-FOR-BUILD/config.log
Error running configure at ./autogen.sh line 316.

你好请问下这个错误的怎么结局

config打印是下面

configure:15119: checking pkg-config is at least version 0.9.0
configure:15122: result: yes
configure:15460: checking for ar
configure:15487: result: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar
configure:15552: checking for nm
configure:15579: result: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/nm
configure:15644: checking for ranlib
configure:15671: result: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib
configure:15737: checking for objdump
configure:15753: found /usr/bin/objdump
configure:15764: result: objdump
configure:15829: checking for readelf
configure:15859: result: no
configure:15921: checking for strip
configure:15948: result: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip
configure:16169: checking for bogus pkg-config
configure:16179: error: yes, from unknown origin. This *will* break the build. Please modify your PATH variable so that /usr/local/bin/pkg-config is no longer found by configure scripts.

在鲲鹏服务器上编译发现如下错误,查阅是汇编上的错误,怎么修改armhelper.s:48: 错误:junk at end of line, first unrecognized character is `@’

在鲲鹏服务器上编译,在执行make后,提示这么个信息,编译的版本是5.4版本的,用的gcc是7.3版本的,在形成configure文件时添加的参数是–disable-gtk –without-java –with-package-format=rpm –enable-epm –with-external-tar=/home/libretars –build=arm-linux –without-doxygen –without-junit –without-help –without-helppack-integration,编译参数用的相同的参数

没试过不知道哦。我觉得理论上肯定能,如果出错那肯定是编译器有bug.

想知道iOS现在如何构建,官方源码下载后按照他提供的一个过时的文档编译,在模拟器那一块出现错误,无法编译通过,也没有形成.a等文件

据我所知,目前用于手机端可用的 LibreOffice 只有 Collabora Office for Android and iOS,见:https://www.collaboraoffice.com/collabora-office-android-ios-release-notes/ 。 可以直接下载已经编译好的安装包。如果要从源代码重新编译,则应当使用 online 仓库的源代码(https://git.libreofficechina.org/online/),编译过程请参考:https://collaboraonline.github.io/post/build-code-ios/

configure: error: Package requirements (fontconfig >= 2.4.1) were not met:

No package ‘fontconfig’ found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables FONTCONFIG_CFLAGS
and FONTCONFIG_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
Error running configure at ./autogen.sh line 316.
有没有遇到这样的问题

你编译的是哪个版本?是在什么host系统中编译的?如果是在Ubuntu上,那么你需要安装 libfontconfig1-dev 包,Fedora下这个包叫fontconfig-devel.

发表评论

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

*