如何为32位和64位环境正确构建Winelib DLL?
解决OpenSUSE Tumbleweed下64位Winelib DLL编译问题
正确的64位编译命令
OpenSUSE的Winelib包布局和其他发行版不同,64位所需的归档库(如libkernel32.a、libntdll.a)被放在/usr/lib64/wine/x86_64-windows目录下,而非x86_64-unix。直接指定这个路径即可完成链接:
winegcc -L/usr/lib64/wine/x86_64-windows -shared -o myproject64.dll myproject_main.c myproject.spec
别担心目录里的PE格式文件,winegcc工具本身就能正确处理这些归档文件,生成可被64位Wine进程加载的.dll.so共享对象。
先确认依赖包是否齐全
确保已经安装了完整的Winelib开发套件,避免因缺失组件导致错误:
sudo zypper install wine-devel wine-devel-32bit
这个命令会同步安装32位和64位的所有头文件、库文件及工具链组件。
检查spec文件的兼容性
- 确保
myproject.spec里没有硬编码32位相关的编译选项或路径,比如-m32标记要移除。 - 如果spec中有
LIBRARY或EXPORTS声明,确认没有架构相关的限制,保持64位编译时的通用性。
替代方案:从源码编译Wine(如果官方包问题持续)
如果OpenSUSE官方包的布局始终导致链接问题,可以直接从WineHQ源码编译自定义版本,获得标准的库路径布局:
- 先安装编译依赖:
sudo zypper install git autoconf automake bison flex libtool gcc-c++ libX11-devel libXext-devel libXcursor-devel libXi-devel libXxf86vm-devel libXrandr-devel libXinerama-devel libXrender-devel libXcomposite-devel libXdamage-devel libXfixes-devel libX11-xcb-devel libxcb-devel libxcb-keysyms1-devel libxcb-render-util0-devel libxcb-shm0-devel libxcb-xfixes0-devel libxcb-xinerama0-devel libxcb-xkb-devel libxcb-cursor-devel libvulkan-devel libasound2-devel libpulse-devel libdbus-1-devel libudev-devel libfontconfig-devel libfreetype6-devel libgnutls-devel libxml2-devel libjpeg-devel libpng-devel libtiff-devel libgif-devel libncurses-devel libstdc++-devel libcap-devel libcups2-devel libsane-devel libgphoto2-devel libopenal-devel libldap2-devel libgstreamer-1_0-0-devel libgstreamer-plugins-base-1_0-0-devel libusb-1_0-devel libblkid-devel libosmesa6-devel libglvnd-devel
- 克隆源码并编译64位Winelib:
git clone https://gitlab.winehq.org/wine/wine.git cd wine ./configure --enable-winelib --prefix=/usr/local/wine64 make -j$(nproc) sudo make install
- 使用自定义编译的winegcc编译你的DLL:
/usr/local/wine64/bin/winegcc -shared -o myproject64.dll myproject_main.c myproject.spec
这种方式生成的Wine环境会遵循标准路径布局,无需手动指定库目录。
内容的提问来源于stack exchange,提问作者Alexander Leithner
相关产品推荐
相关产品推荐

