[ Content contribution] 记一次编译MikTeX
Tofloor
poster avatar
把一切操作变成GUI
deepin
Backbone of ecological co-construction group
2024-02-26 04:13
Author

记一次编译Miktex

起因是看到这篇帖子有人想用这个软件:https://bbs.deepin.org/zh/post/268650

然后看看能不能编译一下,好让他或者其他有需要的用户方便使用,所以记录了下这次编译过程


MiKTeX(发音为mick-tech)是TeX/LaTeX及相关程序的最新实现。

TeX是由Donald Ervin Knuth编写的排版系统,他表示这个系统旨在创作美观的论文,尤其是包含大量数学内容的书籍。


注意:所有下载的文件都放在跟你deepin文件系统类型一致的目录或者分区中,切勿放在NTFS文件系统,否则会发生未知的编译错误。

网站写着cmake最低要求是7.0,但是后面编译miktex的时候提示至少要3.16

https://cmake.org/files/

这里我们选择3.25版本,因为后面log4cxx的编译版本比较高

选择cmake-3.25.0-Linux-x86_64.sh下载

下载完之后右键-属性设置为以可执行程序执行

sudo ./cmake-3.25.0-linux-x86_64.sh --skip-license --exclude-subdir --prefix=/usr/local

升级cmake到25.0版本

替换旧的版本

sudo update-alternatives --install /usr/bin/cmake cmake /usr/local/bin/cmake 1 --force

以下卸载旧版的操作不一定要执行,根据你实际情况来(其实可以跳过,因为上面指定了cmake版本了):

你可以尝试以下步骤来卸载旧版的CMake

  1. 打开终端。

  2. 输入 which cmake来查看当前正在使用的CMake的路径。

  3. 如果这个路径指向的是旧版本的CMake,那么你可以使用

    rm
    

    命令来删除它:

    sudo rm -rf /path/to/old/cmake
    

    其中

    /path/to/old/cmake
    

    应该被替换为旧版本CMake的路径。


以下开始编译Miktex

需要安装的包

所有平台:

cat
fop
sed
xsltproc

在类unix平台(包括macOS)上,您将需要这些库的开发包:

- apr
- aprutil
- bzip2
- cairo
- expat
- fontconfig
- freetype2
- fribidi
- gd
- gmp
- graphite2
- harfbuzz-icu
- hunspell
- icu
- jpeg
- log4cxx
- lzma
- mpfr
- mspack
- LibreSSL (or OpenSSL)
- pixman
- png
- poppler
- popt
- potrace
- uriparser
- zzip

使用Qt5构建UI组件时:

poppler-qt5

接下来在终端输入来安装这些包,一次一次地编译,期间不断补充需要的包,在这里就一次安装掉免得补来补去:

for pkg in libmpfi-dev libboost-all-dev liburiparser-dev libzzip-dev libpopt-dev libmspack-dev libmpfr-dev libhunspell-dev libgmp-dev libgd-dev libcurl4-openssl-dev libboost-all-dev libbz2-dev cat fop sed xsltproc bzip2 cairo expat fontconfig freetype2 fribidi gd gmp graphite2 harfbuzz-icu hunspell icu jpeg log4cxx lzma mpfr mspack OpenSSL pixman png poppler popt potrace uriparser zzip poppler-qt5; do
    if ! dpkg -l | grep -q $pkg; then
        sudo apt-get install -y $pkg
    fi
done

出现提示:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成         
E: 无法定位软件包 freetype2
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成         
E: 无法定位软件包 log4cxx
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成         
E: 无法定位软件包 mspack
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成         
E: 无法定位软件包 LibreSSL
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成         
E: 无法定位软件包 uriparser
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成         
E: 无法定位软件包 zzip

有几个包没有安装成功:

我们来看看:

看起来您正在尝试安装一些软件包,但是遇到了问题。这可能是因为这些软件包在您的软件源中不存在,或者它们的名称被错误地键入了。以下是我找到的一些可能的解决方案:

  • freetype2: 这个软件包可能在某些发行版中被称为libfreetype6。您可以尝试使用sudo apt-get install libfreetype6来安装它。

    输入 sudo apt-get install libfreetype6


  • log4cxx: 这是Apache的一个项目,开源日志库,您可能需要从源代码编译它。

    先卸载原有的apr

    sudo apt remove libapr1
    
    //再安装以下内容
    
    apt-get install build-essential libapr1-dev libaprutil1-dev gzip zip
    
    cd apache-Log4cxx-x.x.x
    
    mkdir build
    
    cd build
    
    ccmake ..
    
    make
    
    sudo make install
    

在usr目录下搜索可以看到

image.png

检查一下apr和apr-util是否成功安装:

dpkg -l | grep apr
ii  libapr1:amd64                                  1.7.2-3                                   amd64        Apache Portable Runtime Library
ii  libaprutil1:amd64                              1.6.3-1                                   amd64        Apache Portable Runtime Utility Library
ii  libchromaprint1:amd64                          1.5.1-4                                   amd64        audio fingerprint library
正常(如果没有请输入

sudo apt install libapr1 libaprutil1 -y)

注意版本要求太高的话可能cmake要升级版本。

  • mspack: 这可能是一个名为libmspack0的软件包。您可以尝试使用 sudo apt-get install libmspack0来安装它。

    输入 sudo apt-get install libmspack0 解决

  • LibreSSL: 这是一个开源项目,那我们就不用他来安装,我们上面已经用OpenSSL来替代了。

  • uriparser: 这是一个开源项目,uriparser是一个严格遵循RFC 3986标准的URI解析和处理库

    输入

    sudo apt install liburiparser1
    
  • zzip:这好像是一个很久以前的压缩工具,我去到zzip作者(Damien Debin)的网站上:https://archives.damiendebin.net/zzip/

这里找到zzip包的下载地址:https://archives.damiendebin.net/zzip/download.html#zzip

下载链接是:https://archives.damiendebin.net/zzip/files/zzip-linux.tar.gz
下载完之后我把二进制文件直接放进 /usr/local/bin

在终端输入zzip,显示正常。


中途发现还需要安装这几个

sudo apt install qt6-tools-dev  qt6-declarative-dev qt6-5compat-dev qt5-default qttools5-dev qtscript5-dev

还要在这里下载libmpfi-dev相关包

http://ftp.cn.debian.org/debian/pool/main/m/mpfi/

选择 libmpfi0_1.5.3+ds-6+b1_amd64 .deblibmpfi-dev-common_1.5.3+ds-6_all.deb libmpfi-dev_1.5.3+ds-6+b1_amd64

安装这几个deb包之后,


他建议我们在源码目录之外构建,那么我们就在源码的文件夹旁边新建一个英文名字的文件夹 tex

有两种方式可以编译:

在(含有cmakelists.txt)源码目录打开终端,输入

sudo cmake -B ../tex

或者

sudo cmake -B ../tex -DCMAKE_INSTALL_PREFIX=/opt/miktex -DWITH_UI_QT=ON
//备用sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/miktex -DWITH_UI_QT=ON -DMPFI_LIBRARY=/usr/lib/x86_64-linux-gnu/libmpfi.so -DMPFI_INCLUDE_DIR=/usr/include -Wno-dev ..

在这时候CMake已经创建了一个标准的安装目标,也就是刚刚的tex文件夹(里面含有makefile文件)

你可以用它来在标准位置(见上文的CMAKE_INSTALL_PREFIX描述)安装所有东西。在Linux和macOS上,运行

sudo make install

这将在/usr/local前缀的目录树中安装MiKTeX。(分散在bin、lib、share等文件夹里)

重新定位安装 在类Unix平台上,你可以使用DESTDIR机制来重新定位整个安装:

sudo make DESTDIR=/home/你的用户名/你创建的文件夹 install
//(有条件的话可以在后面加上 -j4 用多核加快编译速度,但是可能会因为顺序出现错误,慎用)

这个可以使所有的文件都放在一个文件夹

.
└── usr
    └── local
        ├── bin
        ├── lib
        ├── libexec
        └── share

这将使用安装前缀(CMAKE_INSTALL_PREFIX)加上DESTDIR的值来安装所有东西,最终得到/home/xxx/usr/local。 DESTDIR机制在你想了解make install在哪里安装了什么时很有用。

要等一段时间,在编译。。。

好慢。。。。要挺久的:

image.png


构建变量 在运行CMake生成Makefiles时,可以按如下方式设置构建变量:

cmake -DVAR1=VAL1 -DVAR2=VAL2 ...

可选的有:

CMAKE_INSTALL_PREFIX=PATH

其中PATH可选:

这是由make install(见下文)使用的安装目录。此变量在类Unix系统(包括macOS)上默认为/usr/local。

$HOME/miktex
//如果你只想为自己安装MiKTeX,使用这个前缀。不需要管理员权限。

/opt/miktex
如果你想创建一个不与其他系统包冲突的自包含MiKTeX设置,使用这个前缀。
//符号链接 MiKTeX的大多数可执行文件都带有miktex-前缀。例如,pdfTeX可执行文件的文件名是miktex-pdftex。你可以创建指向带前缀的可执行文件的符号链接:
initexmf --admin --mklinks

运行此命令后,只要pdftex之前不存在(使用–force选项来覆盖现有的链接名),都可以调用pdfTeX引擎。

至此基本上编译已经完成,可以在终端输入

miktex-console

或者去你刚刚定义的opt目录下找到bin文件夹,里面基本上就是miktex所带的可执行程序了。


卸载 如果你想完全清除MiKTeX,你必须:

  • 移除符号链接
  • 撤销make install
  • 移除MiKTeX目录

在你开始之前,你应该运行 initexmf --report以找到MiKTeX目录的位置。

移除符号链接 运行

initexmf --admin --force --remove-links

来移除由initexmf --mklinks创建的符号链接(见上文)。

卸载 有一个uninstall目标,你可以用它来移除所有由make install安装的文件(见上文):

make uninstall

移除MiKTeX目录 有一些MiKTeX目录需要手动移除。例如:

rm -fr ~/.miktex
rm -fr /var/lib/miktex-texmf
rm -fr /var/cache/miktex-texmf
rm -fr /usr/local/share/miktex-texmf

请查看initexmf --report的输出,以找出确切的位置。


make 的时候出现错误:

这个错误信息表示在链接过程中出现了问题,导致 make 命令无法成功完成。具体来说,链接器(ld)在尝试链接

这可能是因为虽然您已经安装了 MPFI 库,但是链接器没有找到正确的库文件。您可以尝试以下步骤来解决这个问题:

确认 MPFI 库文件(libmpfi.so)是否存在。您可以使用以下命令来检查:
ls /usr/lib/x86_64-linux-gnu/libmpfi.so

如果这个文件存在,那么命令会输出文件的路径。否则,命令不会有任何输出。

如果 libmpfi.so 文件存在,那么可能是链接器没有找到正确的路径。您可以尝试在 cmake 命令中再次指定 MPFI 库的路径,例如:

sudo cmake -DCMAKE_INSTALL_PREFIX=/opt/miktex -DWITH_UI_QT=ON -DMPFI_LIBRARY=/usr/lib/x86_64-linux-gnu/libmpfi.so -DMPFI_INCLUDE_DIR=/usr/include ..

然后再次运行 make 命令。

Reply Favorite View the author
All Replies
把一切操作变成GUI
deepin
Backbone of ecological co-construction group
2024-02-26 04:13
#1

顺便打了个deb包:

https://eic.lanzoum.com/i5YYu1pe5ded

不知道上架是否成功

(话说上架最后一步的应用截图真难用,怎么截都不对比例,可以改进一下吗?都到上架的最后一步了)

Reply View the author
139******36
deepin
2024-02-26 05:31
#2

再次感谢,经过热心朋友们的帮助,终于可以正常 使用了。

读了您的文章,长了见识,非常感谢。写的很详细,特别是解决问题的思路。

Reply View the author
阿尼樱奈奈
Moderator
2024-02-26 08:30
#3

like

Reply View the author
Ziggy
deepin
2024-02-26 10:13
#4

kissing_heart 感谢投递

截图比例目前常用是大图1440x960或小图1050x700

cmake模式下依赖缺失检测的话其实也可以通过modules来查看检查的所有包的,一般会有Findxx.cmake这类文件,里面会写依据某个文件来查找依赖或者直接提示安装某个dev包

图片.png

可以依据头文件结合apt-file search来查找对应的库

Reply View the author
把一切操作变成GUI
deepin
Backbone of ecological co-construction group
2024-02-26 14:04
#5
Ziggy

kissing_heart 感谢投递

截图比例目前常用是大图1440x960或小图1050x700

cmake模式下依赖缺失检测的话其实也可以通过modules来查看检查的所有包的,一般会有Findxx.cmake这类文件,里面会写依据某个文件来查找依赖或者直接提示安装某个dev包

图片.png

可以依据头文件结合apt-file search来查找对应的库

我才发现还有apt-file这么好用的工具,试了一下,真方便


那个截图尺寸,在deepin上面很难控制到这么精准的截图尺寸的嘞~差一个像素都不行,为什么要限制的这么死呢~

Reply View the author