分类
代码开发

如何编译 LibreOffice

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

(于2021-05-22针对最新编译问题进行了更新,在Fedora 33下测试通过)

一、安装编译环境依赖

$ sudo dnf builddep libreoffice

$ sudo dnf install ccache  # 安装 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 或 deb 格式的安装包,则需要安装这两个依赖项

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

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

$ git clone --depth=1 --branch libreoffice-7-1 git://go.suokunlong.cn/lo/core ./libreoffice-7-1
正克隆到 './libreoffice-7-1'…
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-1/
$ 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-1/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.sh命令生成makefile,这样做就会按照默认的编译选项进行。你也可以将编译选项作为autogen.sh运行时的参数传递给它,这种情况下就会使用命令行参数作为编译选项。

但最方便的是通过autogen.input来设置编译选项。这个文件仅在不存在任何命令行参数时才会生效。在克隆的源代码根目录下建立 autogen.input 文件,内容如下。完整的编译配置选项及其含义,见源代码根目录下的configure文件。

# 我一般直接在线浏览帮助文档,因此将帮助禁用了
--without-help
--without-helppack-integration

# 启用简体及繁体中文用户界面
--with-lang=zh-CN zh-TW

# 自己编译的话在线更新及崩溃报告功能就没啥用了,禁用
--disable-online-update
--disable-breakpad

# 禁用 Office Development Kit。若启用 ODK,则额外需要doxygen依赖项。
--disable-odk
--without-doxygen

# 若编译好之后您需要rpm (或deb)包,则需要启用下列两项:
--enable-epm
--with-package-format=rpm

# 若您需要在多个不同版本的编译之间共享external_tarballs第三方源代码包,则可设置下列选项:
# --with-external-tar=<external_tarballs文件夹路径>

# 现在很多功能都用不到java了,因此我直接将其禁用
--without-java

# 我需要用到firebird数据库,因此启用
--enable-firebird-sdbc
--without-system-firebird

--enable-python=internal

四、编译(autogen.sh && make)

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

./autogen.sh

若提示缺少某个包,则很可能是需要手动安装这个包的devel版本。若看到如下的提示,则表示autogen.sh运行无错误:


****************************************************************************

To build, run:
/usr/bin/make

To view some help, run:
/usr/bin/make help

After the build has finished successfully, you can immediately run what you built using the command:
instdir/program/soffice

If you want to run the smoketest, run:
/usr/bin/make check

*************************************

此时就可以运行 make 命令进行编译了:

make

此时,若提示正在从 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核心数,后续更改源代码后增量编译耗时从几秒钟到几小时不等,取决于代码更改的程度。若需要频繁重新编译,则安装ccache包是个不错的选择,autogen.sh若检测到你安装了ccache则会自动启用。你也可以用icecream等分布式编译方式加速编译。

编译完成后,执行 .instdir/program/soffice 即可运行。若在autogen.input 中启用了 “–with_package_format=rpm deb” ,则生成的安装包在 workdir/installation中。

常见错误解决

1. configure: error: The missing Perl modules are: FindBin

解决:安装perl的FindBin包,一般情况下你的Linux发行版包管理器中已经有现成的:$ sudo dnf install perl-FindBin

Kevin Suo

LibreOffice 简体中文用户界面及官方网站本地化翻译,wiki贡献者,QA质控团队参与者。

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

make的时候这个报错,请问是怎么回事

[build DEP] LNK:Library/libepoxy.so
coreconf/config.mk:138: CPU_ARCH is not x86_64, disabling -mavx2
make build_nspr
coreconf/config.mk:138: CPU_ARCH is not x86_64, disabling -mavx2
mkdir -p ./../nspr/out
cd ./../nspr/out ; \
CC="gcc" CXX="g++" sh ../configure \
--disable-debug --enable-optimize --enable-64bit \
--with-dist-prefix='/home/logsaas/libreoffice/libreoffice-7.3.2.1/workdir/UnpackedTarball/nss/nss/../dist/out' \
--with-dist-includedir='/home/logsaas/libreoffice/libreoffice-7.3.2.1/workdir/UnpackedTarball/nss/nss/../dist/out/include'
make -C ./../nspr/out
make: *** ../nspr/out: No such file or directory.  Stop.
make[3]: *** [build_nspr] Error 2
make[2]: *** [nss_build_all] Error 2
[build DEP] LNK:Library/libepoxy.so
coreconf/config.mk:138: CPU_ARCH is not x86_64, disabling -mavx2
make build_nspr
coreconf/config.mk:138: CPU_ARCH is not x86_64, disabling -mavx2
mkdir -p ./../nspr/out
cd ./../nspr/out ; \
CC="gcc" CXX="g++" sh ../configure \
--disable-debug --enable-optimize --enable-64bit \
--with-dist-prefix='/home/logsaas/libreoffice/libreoffice-7.3.2.1/workdir/UnpackedTarball/nss/nss/../dist/out' \
--with-dist-includedir='/home/logsaas/libreoffice/libreoffice-7.3.2.1/workdir/UnpackedTarball/nss/nss/../dist/out/include'
make -C ./../nspr/out
make: *** ../nspr/out: No such file or directory.  Stop.
make[3]: *** [build_nspr] Error 2
make[2]: *** [nss_build_all] Error 2

您好,make的时候报这个错,我尝试mkdir out目录,又报找不到makefile,我感觉是cpu是arm哪里需要配置,但是无从下手

大佬们,make报这个错,有没有遇到过

make[2]: *** [libharfbuzz_la-hb-face.lo] 错误 1
make[2]: *** 正在等待未完成的任务....
make[1]: *** [/opt/libreoffice-7.2.2.2/workdir/ExternalProject/harfbuzz/build] 错误 1
make[1]: *** 正在等待未完成的任务....
make: *** [build] 错误 2

我也在搞arm编译的,但是好像cpu识别有问题,不知道咋搞,你那个x86的肯定没用

上面的发的问题没有了,但是不同的函数报这个错,我看说是个bug,我改了还是不行,你编译出来了吗

ucbstorage.cxx:(.text+0x645b): undefined reference to `non-virtual thunk to cppu::WeakImplHelper::acquire()'

那你咋编译呀

/home/logsaas/libreoffice-7-1/workdir/CxxObject/xmloff/source/core/xmlimp.o: In function `SvXMLImport::SetAutoStyles(SvXMLStylesContext*)':
xmlimp.cxx:(.text+0x8b90): undefined reference to `non-virtual thunk to cppu::WeakImplHelper::acquire()'
 
我加了template class uno::Reference ;这个还是报错,其它的问题加了就可以了

> 我idev频道聊了,都没能理我
在IRC频道请教时,要有耐心,开发者大多位于欧洲,有时差,可能你在提问时他们正在睡觉呢,你可以换个时间再问。更有效的办法是向开发者邮件列表发邮件询问,这样很多人就能看到并回应。

可以,但是

Error: Package: lodevbasis7.0-core-7.0.6.2-2.aarch64 (/lodevbasis7.0-core-7.0.6.2-2.aarch64)
           Requires: libfreetype.so.6
Error: Package: lodevbasis7.0-core-7.0.6.2-2.aarch64 (/lodevbasis7.0-core-7.0.6.2-2.aarch64)
           Requires: libXinerama.so.1
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

装的时候提示这两个,我还看已经安装了,也有这个库,不知道咋解决呢

请教下,用arm的centos7.7的自带的或者x86的提供的7版本的libreoffice转换11M的doc几秒钟就可以转换了,但是arm上编译的7.06的得五十分钟,这个是什么原因:
转换命令为

[root@1 logsaas]# libreofficedev7.0 --convert-to pdf:writer_pdf_Export ./2.docx

“用arm的centos7.7的自带的或者x86的提供的7版本的libreoffice转换11M的doc几秒钟就可以转换了”,自带的版本也是7.0.6版吗,还是更新的版本?

大佬,你知道这个怎么安装吗,我装的时候说缺少依赖,包是不是全在这里,其它地方没有,workdir/installation/LibreOfficeDev/rpm/install/LibreOfficeDev_7.0.6.2_Linux_rpm

设置了的,我就把所以的rpm 执行yum -y install *.rpm,报错如下,我看了
[root@1 rpm]# rpm -qf /usr/lib64/libXinerama.so.1
libXinerama-1.1.3-2.1.el7.aarch64
这个包我也装了,我换了高版本的也不行
updates | 2.9 kB 00:00:00
—> Package lodevbasis7.0-draw.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-en-US.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-extension-pdf-import.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-firebird.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-gnome-integration.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-graphicfilter.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-images.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-impress.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-librelogo.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-libreofficekit-data.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-math.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-ogltrans.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-ooofonts.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-ooolinguistic.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-python-script-provider.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-pyuno.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-qtz.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-writer.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-xsltfilter.aarch64 0:7.0.6.2-2 will be installed
—> Package lodevbasis7.0-zh-CN.aarch64 0:7.0.6.2-2 will be installed
–> Finished Dependency Resolution
Error: Package: lodevbasis7.0-core-7.0.6.2-2.aarch64 (/lodevbasis7.0-core-7.0.6.2-2.aarch64)
Requires: libXinerama.so.1
You could try using –skip-broken to work around the problem
You could try running: rpm -Va –nofiles –nodigest
#安装路径
–prefix=/opt/office

#禁用帮助
–without-help
–without-helppack-integration
–disable-postgresql-sdbc

#启用简体中文用户界面
–with-lang=zh-CN
#在线更新及崩溃报告功能禁用
–disable-odk
–without-doxygen
–disable-online-update
–disable-breakpad
–enable-epm
–with-package-format=rpm
#禁用与JUnit有关的测试
–without-junit
#启用libreoffice内置的字体
–with-fonts
#禁用Office Development Kit。若启用ODK,则额外需要doxygen依赖项。
#若编译好之后您需要rpm (或deb)包,则需要启用下列两项,默认不启用:
#编译之间共享external_tarballs第三方源代码包,为加快编译速度,可以预先在国内镜像下载(https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs/)。
#设置–with-external-tar选项指定第三方源代码包路径:
–with-system-nss
–with-external-tar=/home/logsaas/libreoffice/dl/libreoffice/external_tarballs
#禁用自带java
–without-java
#需要用到firebird数据库则要启用,默认不启用
–enable-firebird-sdbc
–without-system-firebird
–enable-python=internal

你运行autogen.sh以及编译make是以root用户进行的吗?随然我没试过,但是我看到过如果以root进行libreoffice编译会出现很多不可预期的问题,不知道会不会跟这个又关。另外,你在邮件列表中提供的代码粘贴链接是无效的,有人已经回复你了让你重新粘贴。

恩,我现在编译好了,这个问题就是依赖库的问题还可以问他们吗,只是链接无效吗,我只是个小运维,我都不知道怎么和他们聊,我看说root编译,好像没问题,我建了个用户,然后给了sudo权限老是出问题

粘贴Christian Lohmaier在邮件列表中的回复:

When building packages using the epm method, the dependency gets added by instsetoo_native/inc_openoffice/unix/find-requires-x11.sh – and it looks like it should also add the ()(64bit) marker to the dependency when PLATFORMID is linux_aarch64 and not only for linux_x86_64

check with rpm -q –provides libXinerama-1.1.3-2.1.el7.aarch64 whether it provides “libXinerama.so.1()(64bit)”

libXinerama-devel-1.1.3-2.1.el7.aarch64
libXinerama-1.1.3-2.1.el7.aarch64
这些东西我都检查过的
libxinerama1这个叶装了没用,不知道是不是版本有问题,但是不知道装哪个了

注意回复邮件列表时请“回复全部”,确保邮件列表的地址在收件人中。另外,邮件主题中请删除“Re: 回复:回复:回复:回复:回复:libreoffice-7.3.2 compile in arm system”前面的“回复”,只保留一个Re。

您好,我在欧拉系统上编译6.0.6.1版本,执行autogen.sh时提示:

checking build system type... aarch64-unknown-linux-gnu
checking host system type... aarch64-unknown-linux-gnu
checking for product name... LibreOfficeDev
checking for package version... 6.0.6.1
checking for product version... 6.0

最后提示

****************************************************************************
To build, run:
/usr/bin/make
······

之后执行了make,出现错误提示:

drbg.c: 在函数‘RNG_RandomUpdate’中:
../../../dist/out/include/prtypes.h:593:38: 错误:数组‘arg’的大小为负
     extern void pr_static_assert(int arg[(condition) ? 1 : -1])
                                      ^
drbg.c:541:5: 附注:in expansion of macro ‘PR_STATIC_ASSERT’
     PR_STATIC_ASSERT(sizeof(size_t) <= 4);
     ^~~~~~~~~~~~~~~~
make[5]: *** [../../coreconf/rules.mk:393:out/Linux_SINGLE_SHLIB/drbg.o] 错误 1
make[4]: *** [Makefile:626:libs] 错误 2
make[3]: *** [../coreconf/rules.mk:101:libs] 错误 2
make[2]: *** [coreconf/rules.mk:101:libs] 错误 2
make[1]: *** [/home/eng/make_libreoffice/libreoffice-6.0.6.1/external/nss/ExternalProject_nss.mk:34:/home/eng/make_libreoffice/libreoffice-6.0.6.1/workdir/ExternalProject/nss/build] 错误 1

·········

gawk: fatal: cannot use gawk builtin `namespace' as variable name
make[4]: *** [Makefile:1324:errnos-sym.h] 错误 2
make[3]: *** [Makefile:474:all-recursive] 错误 1
make[2]: *** [Makefile:405:all] 错误 2
make[1]: *** [/home/eng/make_libreoffice/libreoffice-6.0.6.1/external/libgpg-error/ExternalProject_libgpg-error.mk:36:/home/eng/make_libreoffice/libreoffice-6.0.6.1/workdir/ExternalProject/libgpg-error/build] 错误 1
make: *** [Makefile:269:build] 错误 2

看了源码drbg.c中提示问题的地方,是走了32位情况的条件编译,怎么能设定64位编译?或者有其他解决办法吗?

抱歉,你的评论被加入到了垃圾评论队列,刚刚看到。

你提到的问题我得再想想,但是你能不能先试试编译最新的7.3版本?6.0有点老了,老版本用最新的编译工具不可避免会出现问题。

比如你提到的libgpg的错误,应该是与https://dev.gnupg.org/T4459中提到的是一样的,这个错误已在https://dev.gnupg.org/rE7865041c77f4f7005282f10f9b6666b19072fbdf中修复,造成问题的原因是libgpg编译时依赖Gawk,而如果系统上的gawk是新版本的Gawk 5.0或更高版本的话就会报错。

实际上,如果你在现在的操作系统上(基于最新的工具链)来编译libreoffice 3.5,是肯定没法通过的,会有各种错误,而libreoffice 3.5在它当时的各个操作系统下都能编译通过。要想在新系统上顺利编译旧版本,你就需要用老旧的操作系统。

CPU:Loongson-3C5000LL
系统:Loongnix-Server Linux release 8.3
libreofficeb版本:7.2.5.1

大佬好,我需要编译安装libreoffice。但是configure最后出了个错误:

configure: WARNING: You are building 32-bit binaries but the JDK is 64-bit
configure: error: You should pass the --with-jdk-home option pointing to a (32-bit) JDK

这是不是由于libreoffice不认识龙芯的cpu,导致错误认为是个32位的cpu?

之后我configure后面加上–without-java,可以过了。但是后面make过不去,提示:

/home/user1/libreoffice-7.2.5.1/solenv/gbuild/UnoApiTarget.mk:127: *** gb_UnoApiHeadersTarget_select_variant must be defined by platform. Stop.

configure: WARNING: You are building 32-bit binaries but the JDK is 64-bit

这个很明显,你的CPU是64位的、但编译的libreoffice默认是64位的,而是你的JDK却是64位的。如果要启用java,那么你必须也使用32位的JDK,或者使用–host=x86_64-pc-cygwin或者–host=aarch64-pc-cygwin以启用64位libreoffice编译。其实如果不用数据库功能和求解器的话可以–without-java.
见:https://wiki.documentfoundation.org/Development/BuildingOnWindows#Selecting_the_host_.2F_target_system

gb_UnoApiHeadersTarget_select_variant must be defined by platform. Stop.

这个我也不太确定是哪里的问题,你可以先在–without-java的情况下运行一遍make distclean,然后重新运行autogen.sh,再make,如果这个错误还是出现,请提供较为完整的autogen.sh和make的日至,我可以代为在irc上求助。

[user1@514adae7f545 libreoffice-7.2.5.1]$ make 
mkdir -p /home/user1/libreoffice-7.2.5.1/instdir
/home/user1/libreoffice-7.2.5.1/solenv/bin/install-gdb-printers -a /home/user1/libreoffice-7.2.5.1/instdir -c
make -j 32  -rs -f /home/user1/libreoffice-7.2.5.1/Makefile.gbuild build  
/home/user1/libreoffice-7.2.5.1/solenv/gbuild/UnoApiTarget.mk:127: *** gb_UnoApiHeadersTarget_select_variant must be defined by platform.  Stop.
make: *** [Makefile:287: build] Error 2

感谢大佬回复,这是make后的全部信息。应该还是和不认识loongarch64这个架构的cpu有关。。。我其实不需要完整的libreoffice,只要soffice能运行就行。。。龙芯那边据说还在迁移libreoffice,只不过需要时间。我就自己先试试。。

来自红帽的资深开发者Caolán McNamara回复如下:

solenv/gbuild/UnoApiTarget.mk at that location has

ifeq ($(origin gb_UnoApiHeadersTarget_select_variant),undefined)
$(eval $(call gb_Output_error,gb_UnoApiHeadersTarget_select_variant
must be defined by platform))
endif

I expect that gets set by…

gb_UnoApiHeadersTarget_select_variant = $(if $(filter
udkapi,$(1)),comprehensive,$(2))

in solenv/gbuild/platform/unxgcc.mk

and for that to be included by

solenv/gbuild/platform/linux.mk

and for this architecture that should (I think) be included by
solenv/gbuild/platform/LINUX_GODSON64_GCC.mk

so to debug why that might not be happening I’d look into config.log
and search for the line that starts with
CPUNAME=
and see what that is to check that first

简单翻译如下:

在源代码的文件 solenv/gbuild/UnoApiTarget.mk 中,有:

ifeq ($(origin gb_UnoApiHeadersTarget_select_variant),undefined)
$(eval $(call gb_Output_error,gb_UnoApiHeadersTarget_select_variant
must be defined by platform))
endif

对于你的系统而言,我猜测该变量是由 solenv/gbuild/platform/unxgcc.mk 中的以下代码块设置的:

gb_UnoApiHeadersTarget_select_variant = $(if $(filter
udkapi,$(1)),comprehensive,$(2))

而unxgcc.mk被以下文件包含:
solenv/gbuild/platform/linux.mk

而对于你的体系架构而言,我觉得该linux.mk可能被以下文件包含:
solenv/gbuild/platform/LINUX_GODSON64_GCC.mk

因此,要调试并找到原因,你可以先看看config.log中的如下行中:
CPUNAME=
的值是什么,进而判断哪些代码被调用进而一步步出现最开始提到的错误的。

因此,我建议你:
1. 先`make distclean`
2. 再`./autogen.sh`
3. 提供源代码根目录下由autogen.sh生成的config.log文件中的CPUNAME=的值,并通过邮件将该config.log文件发送给我(suokunlong at 126.com,或者最好在论坛中发帖上传附件)

twaindsm_2.4.1.orig.tar.gz这个文件没有在https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs

我缓存的都是我在linux下编译实际用到的。如果需要的人比较多的话,我考虑一下是不是有必要把所有的全部镜像下来。

希望能有一个全部的镜像,我编译的是windows版,可能和Linux所需的内容有些不同,有些内容即便我通过范强(谐音)还是不能通过https://dev-www.libreoffice.org/src/直接下载,比如twaindsm,https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs下也是没有的,还有https://dev-www.libreoffice.org/extern/虽然这个里面的内容不多

twaindsm已下载到了https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs中。里面内容太多了,全部镜像的话我最近可能没时间写抓取代码,等有时间吧。

楼主,你根据collabora公司这篇文章:https://collaboraonline.github.io/post/build-code-android/ ,编译过android吗?我有些问题想要咨询你。

没有哦,感觉android下的没有编译的必要,现成的拿来用就行了,手机上无非是偶尔打开个文件看看应应急

理论上可以,但是LibreOffice的各个模块之间的依赖关系比较复杂,要单独编译其中一个模块的话你需要自己修改源代码,去除不需要的部分,自己处理依赖关系,得不偿失。

近期从6.1.6版本,再到6.4版本,再到7.1版本,最后make都会报错.

armhelper.s: Assembler messages:
armhelper.s:48: Error: junk at end of line, first unrecognized character is `@'
armhelper.s:50: Error: unknown mnemonic `stmfd' -- `stmfd sp!,{r0-r3}#follow other parameters on stack'
armhelper.s:51: Error: operand 1 must be an integer register -- `mov r0,ip#r0 points to functionoffset/vtable'
armhelper.s:52: Error: operand 1 must be an integer register -- `mov r1,sp#r1 points to this and params'
armhelper.s:56: Error: junk at end of line, first unrecognized character is `@'
armhelper.s:58: Error: unknown mnemonic `stmfd' -- `stmfd sp!,{r4,lr}#save return address'
armhelper.s:60: Error: junk at end of line, first unrecognized character is `@'
armhelper.s:62: Error: unexpected characters following instruction at operand 1 -- `bl cpp_vtable_call(PLT)'
armhelper.s:64: Error: unexpected characters following instruction at operand 3 -- `add sp,sp,#4#no need to restore r4(we didn116touch it)'
armhelper.s:65: Error: operand 1 must be an integer register -- `ldr pc,[sp],#20#return,discarding function arguments'
armhelper.s:67: Error: junk at end of line, first unrecognized character is `@'
[UIL] basctl/uiconfig/basicide/ui/newlibdialog
make[1]: *** [/home/unix/Downloads/libreoffice-6.4.7.2/bridges/CustomTarget_gcc3_linux_arm.mk:18: /home/unix/Downloads/libreoffice-6.4.7.2/workdir/CustomTarget/bridges/source/cpp_uno/gcc3_linux_arm/armhelper.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:282: build] Error 2

> 一言若、说:
> 2021-08-12 上午10:08

> 这个错误,只需要修改armhelper.S文件开头的宏定义部分,把@改为#即可
> 应该是早期汇编的行注释时@,然而近期@已经不是汇编的注释了

看来你已经找到原因和解决方案了。

# ARM Android
--with-distro=LibreOfficeAndroidAarch64
--with-android-sdk=/home/haitao/Android/Sdk
--with-android-ndk=/home/haitao/Android/Sdk/android-ndk-r21
# 自己编译的话在线更新及崩溃报告功能就没啥用了,禁用
--disable-online-update
--disable-breakpad

# 禁用与JUnit有关的测试
--without-junit

# 我的系统上已经有字体了,禁用libreoffice内置的字体
#--with-fonts

# 禁用Office Development Kit。若启用ODK,则额外需要doxygen依赖项。
--disable-odk
--without-doxygen
--disable-ext-wiki-publisher
--without-fonts
--without-package-format
--without-omindex
--disable-debug
--disable-sal-log
--disable-symbols
--disable-compiler-plugins
--disable-ooenv
--disable-lto
--disable-gtk4
--disable-introspection

--disable-report-builder
--disable-lpsolve
--disable-coinmp
--enable-mergelibs
--disable-odk
#--disable-gtk
--disable-cairo-canvas
--disable-dbus
--disable-sdremote
--disable-sdremote-bluetooth
--disable-gio
--disable-randr
#--disable-gstreamer-1-0
--disable-cve-tests
--disable-cups
--disable-extension-update
--disable-postgresql-sdbc
--disable-lotuswordpro
--disable-firebird-sdbc
--disable-scripting-beanshell
--disable-scripting-javascript
--disable-largefile
--without-helppack-integration
--without-system-dicts
--disable-gtk3
--disable-dconf
#--disable-gstreamer-0-10
--disable-firebird-sdbc
--without-fonts
--without-junit
#--with-theme="no"
--disable-evolution2
--disable-avahi
--without-myspell-dicts
#--with-galleries="no"
#--disable-kde4
--disable-introspection
--without-krb5
--disable-python
--disable-pch
--disable-ooenv
--disable-dependency-tracking

--disable-avahi
--disable-cairo-canvas
--disable-coinmp
--disable-cups
--disable-cve-tests
--disable-dbus
--disable-dconf
--disable-dependency-tracking
--disable-evolution2
--disable-dbgutil
--disable-extension-integration
--disable-extension-update
--disable-firebird-sdbc
--disable-gio
--disable-gstreamer-1-0
--disable-gtk3
--disable-introspection
--disable-largefile
--disable-lotuswordpro
--disable-lpsolve
--disable-odk
--disable-ooenv
--disable-pch
--disable-postgresql-sdbc
--disable-python
--disable-randr
--disable-report-builder
--disable-scripting-beanshell
--disable-scripting-javascript
--disable-sdremote
--disable-sdremote-bluetooth
--without-export-validation
--without-helppack-integration
--without-junit
--without-krb5
--without-myspell-dicts
--without-system-dicts

你好,我的系统是麒麟V10,make的时候报错如下:

/usr/bin/ld: /lib64//libpangoft2-1.0.so.0: undefined reference to `FcWeightFromOpenTypeDouble'
/usr/bin/ld: /lib64//libpangoft2-1.0.so.0: undefined reference to `FcWeightToOpenTypeDouble'
/usr/bin/ld: /lib64//libpangoft2-1.0.so.0: undefined reference to `FcConfigReference'
collect2: error: ld returned 1 exit status
make[1]: *** [/opt/libreoffice-7.0.6.2/solenv/gbuild/LinkTarget.mk:667: /opt/libreoffice-7.0.6.2/workdir/LinkTarget/Executable/gtktiledviewer] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:282: build] Error 2

我编译的版本是7.0.6.2

平时普通的操作你大可不必、而且不应该用root用户进行操作,用root用户进行这些操作是一个坏习惯。如果是服务器的话,我猜测你的ssh登录也是用的root用户?被黑客破解登录密码只是个时间问题 。

下载、配置、编译以普通用户即可,只在安装rpm包时用sudo或root即可。

############
# 编译环境
############

NAME="Kylin Linux Advanced Server"
VERSION="V10 (Tercel)"
ID="kylin"
VERSION_ID="V10"
PRETTY_NAME="Kylin Linux Advanced Server V10 (Tercel)"
ANSI_COLOR="0;31"

############
# 编译错误(错误具体信息记不清楚了,大概是这个意思)
############

external/python3/ExternalPackage_python3.mk: lines 84: Can't find workdir/UnpackedTarball/python3/LO_lib/_sysconfigdata_m_linux_aarch64-unknown-linux-gnu.py

############
# 错误处理
############
修改源码https://go.suokunlong.cn:88/cgit/lo/core/tree/external/python3/ExternalPackage_python3.mk?h=libreoffice-7-0-5#n143

LO_lib/_sysconfigdata_m_$(python3_MACHDEP)_$(subst i686,i386,$(subst -pc,,$(HOST_PLATFORM))).py \

修改为如下:

LO_lib/_sysconfigdata_m_linux_aarch64-unknown-linux-gnu.py \

再执行make,编译成功

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.

想知道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/

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

在鲲鹏服务器上编译发现如下错误,查阅是汇编上的错误,怎么修改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,编译参数用的相同的参数

这个错误,只需要修改armhelper.S文件开头的宏定义部分,把@改为#即可
应该是早期汇编的行注释时@,然而近期@已经不是汇编的注释了

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.

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

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


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
<...>

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分支能否成功编译,这个分支已经很稳定了而且有很多性能提升。

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

官方没有个微信或qq群什么的吗?arm架构编译有点难搞呀,能否支持下,给个群号

“编译完成后,执行 .instdir/program/soffice 即可运行。若在autogen.input 中启用了 “–with_package_format=rpm deb” ,则生成的安装包在 workdir/installation中。”
上面这句话不是很理解是什么意思,能否仔细说明下

你编译完成后,生成的可执行二进制程序位于你编译所在的源代码根目录下名为instdir的文件夹中,若在这个目录下执行./imstdir/program/soffice,就能直接运行。

如果你想编译生成RPM或DEB安装包(从而能像下载安装已发布的版本一样在你的linux操作系统上安装,而不是在编译所在源代码目录下通过命令行执行./imstdir/program/soffice来运行),那么在编译时你需要在autogen.input文件中(或者以autogen.sh之后所带的参数的形式)加上”–with_package_format=rpm deb”编译选项,这样在编译完成之后就会生成DEB包或RPM包,这些包位于编译所在源代码根目录下的workdir/installation文件夹中。

如果还是不理解,那么你确实需要动手一步一步实践一下,在哪一步出了问题就问具体的问题。

你可以在社区论坛中发帖提出问题,别人看到后懂的话一般都会回复你。确实有个QQ群的,但不是官方的,而是中文社区志愿者建的。我平时不上QQ,群里人多所以即使上了也不会去翻历史聊天记录,所以我觉得还是论坛里问或者回复这个博文问会好一些。

发表评论

您的电子邮箱地址不会被公开。