window10平台的使用最新的vs编译工具编译IUP项目

这里的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文件编辑如下图,然后重新生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值