(六):Winelib开发组件2

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/49682313 话接上节!!(二):编译资源文件:wrc为了编译资源,你应该使用Wine资源编译器,简写为wrc,该编译器会生成一个二进制.res文件。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/49682313

话接上节!!

(二):编译资源文件:wrc

为了编译资源,你应该使用Wine资源编译器,简写为wrc,该编译器会生成一个二进制.res文件。当编译spec文件的时候,该资源文件会被winebuild使用。

winemaker生成的makefiles文件会帮你照料好。但是,如果你要编写自己的Makefile文件的话,你应该将下面的语句加上:

WRC=$(WINE_DIR)/tools/wrc/wrc
WINELIB_FLAGS=-I$(WINE_DIR)/include -DWINELIB -D_REENTRANT
WRCFLAGS = -r -L
.SUFFIXES: .rc .res
.rc.res:
     $(WRC) $(WRCFLAGS) $(WINELIB_FLAGS) -o $@ $<

资源文件中你可能会遇到两个问题:

第一个问题就是C库头文件问题。WRC不知道这些头文件在哪里。如果一个RC文件,他包含头文件的话,你将会得到一个”文件找不到”的错误。下面是解决这个问题的一些方法:

  • 被Winelib头文件传统上使用的解决办法就是在一个#ifndef RC_INVOKED语句上附上包含语句,RC_INVOKED是一个宏名称,是由wrc自动定义的。
  • 你也可以向wrc命令中添加一个或者是多个-I选项,这样他就能找到系统文件。举个例子,你可以添加-I/usr/include -I/usr/lib/gcc-lib/i386-linux/2.95.2/include来迎合C/C++头文件。

但这就会假设你知道这些头文件在哪里,这会降低你的makefile文件对其他平台的可移植性。或者是你可以使用C/C++编译器来运行预处理。为了能够这样做,你可以简单的修改你的makefile文件如下:

.rc.res:
    $(CC) $(CC_OPTS) -DRC_INVOKED -E -x c $< | $(WRC) -N $(WRCFLAGS) $(WINELIB_FLAGS) -o $@

第二个问题就是头文件可能会包含一些arc不能理解的结构。一个典型的例子就是一个返回const类型的函数。wrc期望的函数是两个标识符后跟一个左括号。如果带上const,就有三个标识符后跟一个左括号,因此wrc迷惑了(它实际上应该会忽略所有的windows资源编译器所做的事情)。解决的办法就是在#ifndef RC_INVOKED中添加一个违规语句。

在资源中使用GIF文件是有问题的。最好的结果就是,将他们转换成BMP文件或者是改变你的.res文件。

如果在你的资源文件中,你使用通用的控制/对话框的话,你需要在#include <windows.h>后面添加一个#include <commctrl.h>,这样wrc才能够明白控制专用标志的值。

(三):Spec文件

1:简介

在Windows中,应用和库包含了一些必要的使API能够工作的信息,例如GetProcAddress。所以说在Unix世界中,为了能够使Winelib应用和库以同样的API工作,重复这些数据结构是有必要的。

spec文件就是为了解决上面描述的语义上的差别的。他提供了从一个DLL提取出来的关于每一个API的信息,以使适当的表能够生成。后期这些信息被用于保存日志。

一个典型的spec文件看上去就像下面这样:

@ stdcall -private DllCanUnloadNow()
@ stdcall -private DllGetClassObject(ptr ptr ptr)
@ stdcall -private DllRegisterServer()
@ stdcall -private DllUnregisterServer()

2:更多细节

下面是对spec文件格式更加详细的描述。

# comment text

在’#’后面的任何数据都被认定为注释。

ORDINAL FUNCTYPE OPTIONS EXPORTNAME([ARGTYPE [ARGTYPE [...]]]) HANDLERNAME
@ stdcall CreateDesktopW(wstr wstr ptr long long ptr)
@ stdcall CM_Get_Parent(ptr long long) setupapi.CM_Get_Parent
@ cdecl -arch=x86_64 ceilf(float) MSVCRT_ceilf

这个域可以出现0次或者是多次。每一个实例定义一个函数入口点。被EXPORTNAME([ARGTYPE[ARGTYPE[…]]])定义的原型指定了用于动态链接和参数格式的可用的名称。ORDINAL被与之相对应的功能的序号所代替,或者是使用@进行自动的序号分配(仅仅用于win32)。FUNCTYPE应该是下面的一个:

  • pascal
  • 用于一个Win16函数
  • stdcall
  • 用于一个普通的Win32函数
  • cdecl
  • 用于使用C调用公约的Win32函数
  • varargs
  • 用于一个采用可变数量的参数的Win32函数
  • thiscall
  • 用于使用C++调用公约的Win32函数

    ARGTYPE应该是下面的一个:

  • word
  • 一个16位字
  • s_word
  • 16位的符号字
  • segptr
  • 用于一个分段指针
  • segstr
  • 用于一个指向空结束字符串的分段指针
  • long
  • 一个32位的值
  • ptr
  • 一个线性指针
  • str
  • 用于指向一个空结束字符串的线性指针
  • wstr
  • 用于一个空结束16位编码的字符串的线性指针
  • int64
  • 一个64位数
  • int128
  • 一个128位数
  • float
  • 一个32位浮点数
  • double
  • 一个64位浮点数

对于Wine32函数word,s_word,segptr和segstr是无效的。HANDLERNAME是真实的以32位模式处理需求的Wine函数的名称。Strings应该一直会映射到str,宽字符串会映射到watr。作为一个常用的规则,他依赖于参数是IN,OUT或者是IN/OUT。

  • IN: str/wstr
  • OUT: ptr
  • IN/OUT: str/wstr

这个是用于调试信息的。如果参数是OUT,他将不会被初始化,因此他也不会作为一个字符串被打印。

为了能够在Win16中使用一定数量的参数来声明一个函数,指定函数为无参数。参数将会在CURRENT_STACK16->args中可用。在Win32中,在C文件中指定函数为varargs或者是以”…”作为参数声明。可以查看位于user32.spec文件中的wsprintf*函数作为一个例子。

ORDINAL stub EXPORTNAME

这个域可以出现零次后者是更多次。每一个实例定义了一个stub函数。他使得动态链接中的序号可用,如果函数被调用了,一旦遇到错误信息就会终止运行。

ORDINAL extern EXPORTNAME SYMBOLNAME

这个域可以出现零次或多次。每一个实例都定义了一个映射到一个Wine符号(变量或函数)的条目;EXPORTNAME将会指向在C代码中定义的符号SYMBOLNAME。这个类型仅仅在Win32上工作。


(四):将他们链接到一块

为了成一个可执行程序,你需要链接这些文件:你的对象文件,任何你的应用程序依赖的Windows库,例如gdi32,和你使用的其他附加库。你要链接的所有的库应该是作为.so库可用的。如何他们仅仅在.dll下是可用的,那么请想看“构建Winelib DLLs”这一节。

当你尝试链接你的可执行程序的时候,你才会发现你的当前库中是否丢失符号。在Windows上,帮你构建库的时候,链接器就会立即告诉你一个符号是否未定义。在Unix和Winelib中,不是这样的。符号会被默默的被标注为未定义,只有当你尝试去构建一个可执行程序的时候,链接器才会验证所有的符号。

当首次转换一个库到Winelib成功之前,你应该尝试把他联街道一个可执行程序中。在这个时候,你可能就会发现一些你认为已经实现的未被定义的符号。然后,进入到库源码进行修改。但是你也可能会发现丢失的符号是被定义了的,就像gdi32。这是因为你并没有将gdi32和库链接。修复他的一个方式就是链接这个可执行程序,另外一个方式就是带着gdi32来使用你的库。最好的方式就是回到你的库的Makefile中,显式的将他和gdi32链接起来。

正如你要注意到的,对于Winelib所属库来说并没有完全实现。所以如果一个程序必须要链接ole32的话,你也需要和advapi32,rpcrt4和其他库链接,即使你并不直接使用他们。

为了成一个可执行程序,你需要链接这些文件:你的对象文件,任何你的应用程序依赖的Windows库,例如gdi32,和你使用的其他附加库。你要链接的所有的库应该是作为.so库可用的。如何他们仅仅在.dll下是可用的,那么请想看“构建Winelib DLLs”这一节。

当你尝试链接你的可执行程序的时候,你才会发现你的当前库中是否丢失符号。在Windows上,帮你构建库的时候,链接器就会立即告诉你一个符号是否未定义。在Unix和Winelib中,不是这样的。符号会被默默的被标注为未定义,只有当你尝试去构建一个可执行程序的时候,链接器才会验证所有的符号。

当首次转换一个库到Winelib成功之前,你应该尝试把他联街道一个可执行程序中。在这个时候,你可能就会发现一些你认为已经实现的未被定义的符号。然后,进入到库源码进行修改。但是你也可能会发现丢失的符号是被定义了的,就像gdi32。这是因为你并没有将gdi32和库链接。修复他的一个方式就是链接这个可执行程序,另外一个方式就是带着gdi32来使用你的库。最好的方式就是回到你的库的Makefile中,显式的将他和gdi32链接起来。

正如你要注意到的,对于Winelib所属库来说并没有完全实现。所以如果一个程序必须要链接ole32的话,你也需要和advapi32,rpcrt4和其他库链接,即使你并不直接使用他们。

目录
相关文章
|
安全 中间件 数据安全/隐私保护
中间件的定义,包括它的功能、应用场景以及优势。
中间件是位于操作系统和应用软件间的系统软件,提供数据交换、应用集成、流程管理和安全保障等服务。常用于分布式系统、微服务架构和企业级应用,实现高效、低耦合的系统运行。其优势在于降低开发成本、提升系统性能、简化扩展和维护。中间件推动了软件技术的发展和创新。
2928 1
|
Linux API
嵌入式Linux中的 gpio、gpiod基本分析
嵌入式Linux中的 gpio、gpiod基本分析
1478 0
|
网络协议 算法 Java
万字长文 | 保姆级的后台服务器开发C++学习路线
这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」
|
存储 缓存 算法
【OSTEP】分页: 快速地址转换(TLB) | TLB命中处理 | ASID 与页共享 | TLB替换策略: LRU策略与随机策略 | Culler定律
【OSTEP】分页: 快速地址转换(TLB) | TLB命中处理 | ASID 与页共享 | TLB替换策略: LRU策略与随机策略 | Culler定律
639 0
|
12月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
536 11
|
Web App开发 机器人
小白一学就会的 小红书全自动写文发文机器人-抓取爆款笔记(一)
小白一学就会的 小红书全自动写文发文机器人-抓取爆款笔记(一)
990 4
|
C语言 C++
【c++】c++ 编译链接时提醒 搜索动态库 -lxxxx 时跳过不兼容的libxxx.so
问题描述:这个问题的表现是——在通过g++或者gcc编译链接可执行程序的时候因为代码使用需要,需要添加对应 的三方库,这个时候在编译指令中 需要添加 动态库添加指令 告诉 ld 链接 对应名称的动态库、或者静态库。
966 0
【c++】c++ 编译链接时提醒 搜索动态库 -lxxxx 时跳过不兼容的libxxx.so
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
592 1
|
Ubuntu Linux 编译器
MinGW-w64在windows/ubuntu上的安装及使用
MinGW-w64在windows/ubuntu上的安装及使用
2335 0
|
设计模式 存储 算法
《设计模式:可复用面向对象软件的基础(典藏版)》
本书是埃里克·伽玛著作,涵盖180个笔记,主要介绍面向对象设计模式,包括MVC、设计模式编目、组织编目、实现描述、复用机制、运行时与编译时结构关联、设计支持变化等方面。书中详细解释了23种设计模式,如Abstract Factory、Adapter、Bridge、Builder等,按创建型、结构型、行为型分类,旨在提高软件可复用性和灵活性。
1337 0
《设计模式:可复用面向对象软件的基础(典藏版)》

热门文章

最新文章