编译miktex(2025-10-28)

在windows上,用cmake(cmake-gui)+visual studio 2022+msys2编译miktex。

按此文方法,miktex源码和从官网下载的windows下安装包,版本得一致,加上当前的ICU,给出个一块的压缩包。可从miktex-20251028.rar下载。

 

一、修改<miktex>/CMakeLists,关闭WITH_UI_QT、WITH_UI_MFC、WITH_MIKTEX_DOC

1.1 关闭WITH_UI_QT

option(
    WITH_UI_QT
    "Build Qt components."
    FALSE
)
改为
option(
    WITH_UI_QT
    "Build Qt components."
    FALSE
)

1.2 关闭WITH_UI_MFC

option(
    WITH_UI_MFC
    "Build MFC components."
    ${MSVC}
 )
改为
option(
    WITH_UI_MFC
    "Build MFC components."
    FALSE}
)

1.3 关闭WITH_MIKTEX_DOC

option(
    WITH_MIKTEX_DOC
    "Build miktex-doc package."
    ${WIN32}
)
改为
option(
    WITH_MIKTEX_DOC
    "Build miktex-doc package."
    FALSE
)

 

二、运行CMake(cmake-gui)

2.1 boost

miktex会用到boost组件local。建议方法是去boost官网下载对应visual studio版本的*.exe。像visual studio 2022,那下载boost_1_82_0-msvc-14.3-64.exe。我选1_82_0,是因为我自个工程用的是boost是这版本。

不建议msys2去下载boost方法。否则可会遇到库不兼容,报类以下面错误。

121>LINK : fatal error LNK1104: cannot open file 'libboost_locale-vc143-mt-gd-x64-1_89.lib'

如果用这装boost_1_xx_0-msvc-14.3-64.exe,那在cmake,应该不用新建变量。如果用msys2去下载,那须手动新建个Boost_INCLUDE_DIR变量。

Boost_INCLUDE_DIR(须手动填):C:\local\boost_1_82_0(不是C:/msys64/mingw64/include)

2.2 添加ICU_ROOT变量

miktex会用到ICU,建议不要用msys2,还是上ICU官方下载独立安装包。像icu4c-77_1-Win64-MSVC2022.zip。

不论哪种方法安装ICU,都须要在cmake手动新建ICU_ROOT变量。

ICU_ROOT(须手动增加):C:/movie/icu4c-77_1-Win64-MSVC2022

cmake在Configure、Generate时,应该不会有警告。

 

三、编译miktex.sln

在cmake,Generate结束后,Open Project,会打开miktex.sln工程,在visual studio,执行编译。

 

3.1 Libraries/cairo

54>C:\ddksample\miktex\Libraries\3rd\cairo\source\src\win32\cairo-dwrite-private.hpp(45,9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
54>(compiling source file '../../../../Libraries/3rd/cairo/source/src/win32/cairo-dwrite-font.cpp')
54>C:\ddksample\miktex\Libraries\3rd\cairo\source\src\win32\cairo-dwrite-private.hpp(45,33): error C2146: syntax error: missing ';' before identifier 'DWRITE_COLOR_GLYPH_RUN1_WORKAROUND'
54>(compiling source file '../../../../Libraries/3rd/cairo/source/src/win32/cairo-dwrite-font.cpp')

遇到上面错误,解决办法是,修改libraries/cairo预定义宏

WINVER=0x0A00
_WIN32_WINNT=0x0A00
改为
WINVER=0x0A00
_WIN32_WINNT=0x0A00

这两个宏定义了:1)程序编译时目标的最低Windows版本。2)Windows头文件中可用的 API 集合。3)版本检测函数的行为。

版本号对应关系

0x0500 = Windows 2000
0x0501 = Windows XP
0x0502 = Windows XP SP2 / Server 2003
0x0600 = Windows Vista / Server 2008
0x0601 = Windows 7 / Server 2008 R2  
0x0602 = Windows 8 / Server 2012
0x0603 = Windows 8.1 / Server 2012 R2
0x0A00 = Windows 10 / Server 2016

 

3.2 Libraries/gmp

49>gmp-static.lib(mod_1.obj) : error LNK2019: unresolved external symbol __gmpn_mod_1_1p_cps referenced in function __gmpn_mod_1
49>gmp-static.lib(mod_1.obj) : error LNK2019: unresolved external symbol __gmpn_mod_1_1p referenced in function __gmpn_mod_1
49>gmp-static.lib(mod_1.obj) : error LNK2019: unresolved external symbol __gmpn_mod_1s_2p_cps referenced in function __gmpn_mod_1
49>gmp-static.lib(mod_1.obj) : error LNK2019: unresolved external symbol __gmpn_mod_1s_2p referenced in function __gmpn_mod_1
49>gmp-static.lib(mod_1.obj) : error LNK2019: unresolved external symbol __gmpn_mod_1s_4p_cps referenced in function __gmpn_mod_1
49>gmp-static.lib(mod_1.obj) : error LNK2019: unresolved external symbol __gmpn_mod_1s_4p referenced in function __gmpn_mod_1

遇到上面错误,解决办法是向Libraries/gmp,增加编译三个c文件。

<miktex>/Libraries/3rd/gmp/source/mpn/generic/mod_1_1.c
<miktex>/Libraries/3rd/gmp/source/mpn/generic/mod_1_2.c
<miktex>/Libraries/3rd/gmp/source/mpn/generic/mod_1_3.c

mod_1_1.c实现了__gmpn_mod_1_1p_cps、__gmpn_mod_1_1p,另两个依次类推。

 

四、补足执行环境

运行cmd,可以不用“以管理员身份运行”。

编译成功后,会在output生成个sandbox。但需要下载更多资源文件,才能让miktex正常运行。而且,为得到些带图形界面的app,需要下载更多可执行文件,要得到这些exe,可通过“mpm --update”命令。

 

4.1 mpm --update

运行cmd,当前目录切到C:\ddksample\miktex\output\sandbox\miktex\bin\x64。

C:\ddksample\miktex\output\sandbox\miktex\bin\x64>mpm --update
Warning: --update: this option has been deprecated; it will be removed from a future version of MiKTeX

Sorry, but "MiKTeX Package Manager" did not succeed for the following reason:

  The miktex executable could not be found.

The log file hopefully contains the information to get MiKTeX going again:

  C:\ddksample\miktex\output\sandbox\miktex\log\mpmcli.log

执行mpm失败,解决方法是:清空C:\ddksample\miktex\output\sandbox\miktex\data\le下所有文件。目的是要删除fndb(文件名数据库)缓存。旧的fndb没有miktex.exe,要让重新成个包含了miktex.exe的fndb。

再次执行:mpm --update

C:\ddksample\miktex\output\sandbox\miktex\bin\x64>mpm --update
Warning: --update: this option has been deprecated; it will be removed from a future version of MiKTeX
Installing package biber-windows-x64...
Installing package miktex-arctrl-bin-x64-2.9...
Installing package miktex-asymptote-bin-x64-2.9...
Installing package miktex-autosp-bin-x64-2.9...
......
Installing package miktex-yap-bin-x64-2.9...
Installing package miktex-zip-bin-x64...
Installing package miktex-zlib-bin-x64-2.9...
Installing package miktex-zzip-bin-x64-2.9...
Installing package tetex...

此次就执行成了。在bin目录,可看到多了些exe文件,像miktex-console.exe、miktex-pdflatex.exe、texworks.exe。

在其它目录,有会多出文件,像:C:\ddksample\miktex\output\sandbox\miktex\config\formats.ini

注意,“mpm --update”功能是执行包管理器更新,它除了向toutput/sandbox增加文件外,也会覆盖已有文件,像由visual studio编译生成那件*.exe,像miktec-pdftex.exe,即使原来存在那文件生成时间比网上的那个新。

 

4.2 用texworks.exe,测试一个latex示例

用文件编辑生成个文件,假设文件路径是c:/ddksample/test2.tex。

\documentclass{article}
\usepackage{amsmath}
\begin{document}
my test folum1: $E = mc^2$
my test folum2: $Odd(s) = \frac{p(s=1)}{p(s=0)}$

\end{document}

texworks.exe是个带图形界面的app,由“mpm --update”得到。运行方法有两种,一是双击texworks.exe。二是运行miktex-console.exe,在左下角的“TexWorks”按钮启动texworks.exe,miktex-console.exe也是由“mpm --update”得到。

在texworks.exe,打开c:/ddksample/test2.tex,这里工作区就会显示test2.tex内容。格式就默认的“pdflatex”,单击那个绿色三角按钮,排版。

绿色三角按钮变成红圆白叉,界面弹出类似面的,提示找不到文件pdflatex.ini。一路运行,缺的不只这一个。免得一个个找,我解决办法是从安装官方miktex,像basic-miktex-24.1-x64.exe,然后从那里那资源包都复制过来。

第一步:在C:\ddksample\miktex\output\sandbox,删除miktex外的其它子目录。

C:\ddksample\miktex1\output\sandbox下只剩一个子目录:miktex。

 

第二步:从安装官方miktex复制除miktex外其它目录

basic-miktex-24.1-x64.exe安装后的生成目录,假设是C:\Program Files\MiKTeX,除miktex,其它子目录都复制到C:\ddksample\miktex\output\sandbox。

 

第三步:再次清空C:\ddksample\miktex\output\sandbox\miktex\data\le下所有文件

因为output\sandbox目录下文件出现变动,要清空fndb,让重新生成个新的。

第四步:再次运行texworks.exe

选择test2.tex,这时会看到内容就是上图显示的test2.pdf,目录是C:\ddksample\miktex\output\sandbox\miktex\bin\x64。

到此,已可以成功运行latex示例。

 

五、重编译miktex.sln,对visutsl studio工程miktex-pdftex,可让进入断点调试

texworks排版时,用的格式是pdfLaTex,miktex-pdfLaTex.exe是mpm --update从网上下载,不是此次编译生成。自然的,我们要知道它和由编译生成的miktex-pdfLaTex是什么关系。找不到miktex-pdfLaTex.exe源码,不过在输出日志miktex-pdftex.log,看到下面这条。

2025-10-30 20:17:46,586+0800 INFO  miktex-pdftex - this process (6316) started by texworks in directory C:\ddksample with command line: C:\ddksample\miktex\output\sandbox\miktex\bin\x64\miktex-pdftex.exe -synctex=1 -undump=pdflatex test2.tex

猜测排版时会调用miktex-pdftex.exe,参数:-synctex=1 -undump=pdflatex c:\ddksample\test2.tex。于是让在cmd执行。

C:\ddksample\miktex\output\sandbox\miktex\bin\x64>miktex-pdftex.exe -synctex=1 -undump=pdflatex c:\ddksample\test2.tex

在C:\ddksample\miktex\output\sandbox\miktex\bin\x64,是生成了test2.pdf。

但此时的miktex-pdftex.exe是“mpm --update”从网上下载,得换用visual studio从源码生成。由于被换不只miktex-pdftex.exe,用visual studio中“Build-Rebuild Solution”,重编译miktex.sln。

编译结束后,在项目miktex-pdftex(Programs/TeX and Friends/pdfTeX),修改“Command Arguments”。

Command Arguments值设置:-synctex=1 -undump=pdflatex c:\ddksample\test2.tex

在visual studio运行miktex-pdftex,可看到成功生成了test2.pdf,但位置是在C:\ddksample\miktex\output\Programs\TeXAndFriends\pdftex\pdftex。这是在visual studio运行,你就可以自由设置断点,进入调试了。

 

全部评论: 0

    写评论: