这里的iup项目,可以看线上文档说明,地址:https://www.tecgraf.puc-rio.br/iup/
本文主要讲解和备录平台win10的编译iup源代码可行方案。
如果你是想直接使用iup,那么没必要看本章了。官网也是提供可行的二进制运行文件的。我是热衷于重新编译的,不管是看源代码或者修改源代码都有好处。文档里面只提到编译工具是tecmake,其编译的具体流程也是有的,然而却是很老的编译工具教程,压根不适用。所以,这里记录最新平台和最新的vs编译工具,如何编译源代码的问题。
源代码下载
源代码比较零散,它说所有的库的源代码都可以找到的。然而发现缺少一个fftw3,我是没有找到。
fftw3:https://github.com/FFTW/fftw3.git
主要有这些源代码:
cd,freetype,ftgl,im,lua53(lua的其中一个版本),pdflib7,zlib,fftw3,iup
如下图所示:
编译环境搭建
1.需要visual studio的安装,什么版本不重要,需要的是vs的编译工具。所以可以直接安装最新的。同时需要安装下载对应的c++编译工具
2.安装MinGW工具,可以使得win平台使用make命令。如果找不到make,查看下path的路径是否正常的。
3.文档里面提到tecmake,实际上是个语法糖,调用make工具而已。这个不需要下载的,源代码里面已经嵌入了。比如iup的根目录里面就包含tecmakewin.mak文件了。
编译流程
以下为编译vc22,x86_64架构,lua53的命令示例
编译32位的tec_uname为vc22, 64位为vc22_64,使用lua的5.3版本
常规大部分的编译命令:
64位:make TEC_UNAME=vc22_64 USE_LUA53=1
32位:make TEC_UNAME=vc22 USE_LUA53=1
vc22_64是指定的编译vc工具版本,64是指编译x86_64。需要指定lua版本的,需要指定变量USE_LUA51,USE_LUA52,USE_LUA53,USE_LUA54等等
lua编译需要进入src目录下,然后执行编译命令:
make --no-print-directory -f tecmakewin.mak TEC_UNAME=vc22_64
编译之前的注意项操作
1.编辑文件tecmakewin.mak
因为当前最新的vs为2022版本,直接扩展下vs22的环境变量设置。
编译之前,需要编辑文件tecmakewin.mak
WIN32UNAMES的变量列表追加:vc22
WIN64UNAMES的变量列表追加:vc22_64
把vs的vc编译工具路径配置一下:
追加VC22. 因为空格问题,需要再加个路径VC22_SPACE_ST(把空格用|字符替换掉)路径要填实际所在的安装vs的路径下。
在其后面追加命令
ifneq ($(findstring vc22, $(TEC_UNAME)), )
COMPILER = $(VC22)
COMPILER_SPACE_ST = $(VC22_SPACE_ST)
endif
在后面追加代码,WINSDKVERNUM填实际的版本号,在目录C:\Program Files (x86)\Windows Kits\10下查看下
ifeq "$(COMPILER)" "$(VC22)"
NEW_VC_COMPILER = Yes
NEW_SDK_UM = Yes
NEW_VC_PATH = Yes
TEC_CC = vc
STDDEFS += -DMSVC22
ifndef USE_DLL
#there is no single thread RTL in VC17
USE_MT = Yes
endif
ifdef VC22SDK
PLATSDK ?= $(VC22SDK)
else
# Not the real folder, we copied from "C:\Program Files (x86)\Windows Kits\10"
PLATSDK ?= C:\\Program|Files|(x86)\\Windows|Kits\\10
endif
ifdef BUILD64
SDKLIBBIN := x64
else
SDKLIBBIN := x86
endif
WINSDKVERNUM ?= 10.0.22621.0
RESBIN := $(PLATSDK)/Bin/$(WINSDKVERNUM)/$(SDKLIBBIN)
WINSDKBASEINC := "$(VC22_SPACE_ST)/include"
WINSDKBASELIB := "$(VC22_SPACE_ST)/lib/$(SDKLIBBIN)"
PLATSDK_INC := "$(PLATSDK)/Include/$(WINSDKVERNUM)/ucrt" "$(PLATSDK)/Include/$(WINSDKVERNUM)/um" "$(PLATSDK)/Include/$(WINSDKVERNUM)/shared"
ifdef BUILD64
PLATSDK_LIB := "$(PLATSDK)/Lib/$(WINSDKVERNUM)/ucrt/$(SDKLIBBIN)" "$(PLATSDK)/Lib/$(WINSDKVERNUM)/um/$(SDKLIBBIN)"
else
PLATSDK_LIB := "$(PLATSDK)/Lib/$(WINSDKVERNUM)/ucrt/$(SDKLIBBIN)" "$(PLATSDK)/Lib/$(WINSDKVERNUM)/um/$(SDKLIBBIN)"
endif
endif
找到那些命令:$(addprefix,......), 把其改为$(subst |, ,$(addprefix,......))。主要是把|字段转为空格。这样就可以解决空格路径问题。有空格的路径,需要使用双引号括起来的,如果发现没有括起来,需要给其追加双引号。
有空格问题的路径都一一处理掉。
注意下路径需要双引号的追加,更改完成tecmakewin.mak文件,就可以开始编译了。
注:每一个源代码的根目录或者src目录下的tecmakewin.mak文件,都需要替换使用新的tecmakewin.mak文件。
为啥要改tecmakewin.mak文件?
这里面本身就是需要设置各种的变量环境问题的。同时因为源代码不更新了,tecmake也是。但是win10版本啊,vs编译工具都在不断更新,导致不兼容了。而且里面还会涉及路径存在空格等等问题,需要一些技巧兼容此路径。另外根据官方的注释,可以拷贝一下win10的SDK到一个无空格的新目录下,然后指定这个新目录。而这里直接更改tecmakewin.mak文件,使它可以兼容支持路径存在空格的问题。
2.在fftw3的根目录下执行cmd指令,把api目录下的头文件移动到include目录下
mkdir include
cd api
copy *.h "../include"
因为源代码比较离散多,互相也有依赖关系,这里列下编译顺序。
lua53 pdflib7 zlib cd im freetype ftgl iup
如果一切顺利,那么在iup的lib/vc22_64目录下,可以看到如下图的lib文件:
编译结果:
遇到的编译问题
1.编译im的im_capture提示qedit.h找不到。
找了一些资料:
Where is qedit.h? | Microsoft Learn
简单来说,它是属于microsoft sdk的direct sdk的。microsoft sdk不再提供qedit.h头文件了,因为废弃了它。所以,没必要找到它,直接阉割im_capture。
阉割方法:在im的src文件Makefile,把WINLIBS = 后面的im_capture删掉即可。
2.编译iup的vled_image_editor.c文件语法错误。
这个是编码问题导致的,用编辑器打开,把图中的xBA这个字节删掉
3.编译iup的提示找不到iupstub.lib
进入iup的根目录,执行指令:
make -C ./src/ iupstub TEC_UNAME=vc22_64 USE_LUA53=1
或者在iup的Makefile文件编辑如下图,然后重新生成