记录一次Windows下通过reimp和dlltool转换.lib到.a的过程

2023-05-16

背景是这样的:在linux下的一个C++服务由于特殊原因,需要在windows下跑,该工程为cmake搭建,用到了qt的一些基础库,我们想在qtcreator中用mingw来调试运行,其中用到的activemq客户端库原先已经有现成的dll库,只需要转换.lib到.a即可无缝切换。

上网查阅资料,步骤很简单,先用exports转出def导出文件,然后用mingw下的dlltool转.a:

  • 下载mingw扩展包z:https://sourceforge.net/projects/mingw/files/MinGW/Extension/mingw-utils/
  • exports工具转.def文件,如:
pexports a.dll > a.def

结果发现运行中exports崩溃,放弃本方法。

  • 使用reimp工具生成.def:
reimp -d a.lib #会生成a.def文件

或者直接这样会生成.a(我这里失败了,后面说原因):

reimp a.lib
  •  搜索qt安装目录下的dlltool文件,进入后拷贝a.dll、a.def到此目录中,使用dlltool生成.a
dlltool -D a.dll -d a.def -l liba.a

然后确实生成.a文件了,但是,该文件为空!!!

经过google查询,重于找到答案,原来是dlltool运行时,会自动调用as工具(同一个目录下)执行一些步骤,但是该目录未添加环境变量,导致目录找不到,上面reimp a.lib也是这个原因。

  • 添加-v 查看详细过程
dlltool -D a.dll -d a.def -l liba.a -v

将目录添加到PATH中,并重启cmd后,重于生成.a文件。

赶紧编译试试!!

结果找不到符号。。。

google后又学到了一些:

 mingw用的是gcc编译器,识别函数名的方式和当前编译好的.a方式不一样,对于某个函数,当前.a对应的.def文件中的内容可能是:

?myspace@CTest@GetName   #@分隔类或命名空间

gcc编译好后的可能是:

_NC7myspace5CTest7GetName    #数字进行分隔,并且表示后面字符的个数

经过一番折腾后,通过nm -D 查看了一下mq在linux下的导出接口,然后修改了win下的.def文件(只改关键接口):

_NC7myspace5CTest7GetName=?myspace@CTest@GetName

重新用dlltool工具生成.a文件,大功告成? no,编译虽然过了,但是运行时提示在相应的dll中找不到函数入口。

经过一番思索,发现提示的函数入口正是gcc形式的样式,用depends查看dll导出接口发现还是含有@符号的形式。上网一顿搜后无果,索性曲线救国:

讲修改的def文件在mq的vs工程中添加(项目-属性-链接器-输入-模块定义文件),然后重新编译mq的dll,生成的dll用depends查看,终于看到了指定的导出的接口形式为gcc样式了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录一次Windows下通过reimp和dlltool转换.lib到.a的过程 的相关文章

  • Powershell脚本运行带有参数的exe文件

    我需要脚本来运行带参数的 exe 文件 我就是这么写的 请问有更好的方法吗 Command Networkpath Restart exe Parms t 21600 m 360 r f Prms Parms Split Command P
  • python:Windows终端中的unicode,使用的编码?

    我在 Windows 7 终端中使用 Python 解释器 我正在尝试了解 unicode 和编码 I type gt gt gt s gt gt gt s x89 gt gt gt u u gt gt gt u u xeb 问题1 字符串
  • cygwin winsymlinks:本机不起作用

    我现在和 cygwin 斗争了很长一段时间 我广泛搜索了如何让 cygwin 创建 Windows 风格的符号链接 我尝试了以下方法 export CYGWIN winsymlinks native export CYGWIN winsym
  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • 如何在 C# 中从工作线程发布 UI 消息

    我正在用 C 编写一个简单的 winforms 应用程序 我创建了一个工作线程 我希望主窗口响应线程完成其工作 只需更改文本字段中的一些文本 testField Text Ready 我尝试了事件和回调 但它们都在调用线程的上下文中执行 并
  • Windows 批处理文件:如何启用命令的内联回显

    如果在 Windows 批处理文件中默认禁用 echo 是否有办法为特定命令 内联 启用它 我知道可以回显特定命令disabled通过在命令前添加 但是有没有办法做相反的事情呢 例如 假设有一个像这样的批处理文件 echo off cmd1
  • 如何用C语言测量时间?

    我想知道某个代码块执行了多长时间 大约 像这样的事情 startStopwatch do some calculations stopStopwatch printf lf timeMesuredInSeconds How 您可以使用clo
  • 如何从数据表中设置 DataGridViewComboBoxColumn 中的值?

    DataGridViewComboBoxColumn dgvcb DataGridViewComboBoxColumn grvPackList Columns Units Globals G ProductUtility G Utility
  • Windows:如果我完成驱动器盘符会怎样? (他们26岁了!)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如果我完成驱动器盘符会怎样 这只是好奇心 但我有很多字母 当我把所有东西都连接起来时 我恰好浮动在 20 左右 该图像不是 mspaint
  • Windows 内存映射文件

    我正在尝试研究 Windows 内核在内存映射文件 虚拟内存方面的行为 具体来说 我感兴趣的是确定内存映射文件的内容 由 Windows 刷新到磁盘的频率以及 Windows 使用什么标准来决定是时候这样做 我在网上做了一些研究 除了 MS
  • 使用 .NET 在 Windows 中创建弹出式“烤面包机”通知

    我正在使用 NET 并创建一个桌面应用程序 服务 当触发某些事件时 它将在桌面的一角显示通知 我不想使用常规的消息框 b c 那样会造成太大的干扰 我希望通知滑入视图 然后在几秒钟后淡出 我正在考虑一种类似于 Outlook 收到新邮件时发
  • Pip install 导致此错误“ cl.exe' failed with exit code 2 ”

    我已经阅读了有关此错误的所有其他问题 但令人沮丧的是 没有一个给出有效的解决方案 如果我跑pip install sentencepiece在命令行中 它给出了以下输出 src sentencepiece sentencepiece wra
  • Windows 服务器上的 .htaccess 文件

    我进行了研究 发现我的 htaccess 文件无法在我的新 Windows 服务器上运行 我发现我应该使用 web config 我尝试了一下 但没有任何效果 然后我发现我可以使用 htaccess 文件 但我必须将其命名为其他名称 例如
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 从安全角度来看,在 Windows 中使用管道是否被认为是危险的?

    从安全角度来看 在 Windows 中使用管道是否被认为是危险的 管道在 Windows 中并不是一个特殊的安全风险 如果您担心安全性 请确保将管道上的安全描述符设置为适当的 DACL 如果您的使用要求管道开放供任何人连接 那么您必须将传入
  • C++ 在后台运行 system(),dir 路径中带有空格,+输出到文本文件

    我正在尝试使用一堆选项运行 tshark exe 并输出到 fil 见下文 然而 我真的坚持要使用的 system 命令的正确语法 我以前在这里得到过帮助 甚至已经让它与 dos for 循环一起工作 但这超出了我的能力范围 我已经尝试了各
  • 如何使用命令终止上次打开的 Internet Explorer 窗口?

    我正在尝试编写一个 Windows 命令文件来在 IE 中打开网页 等待其加载 然后关闭 IE 窗口 以下方法有效 但会杀死所有 IE 窗口 因此运行 cmd 之前已打开的所有 IE 窗口也将被关闭 start iexplore exe p
  • 如何使用 Apache Arrow 在 Windows 上使用 C++ 编写 Parquet 格式的文件?

    我正在尝试使用 C 在 Windows 上编写 Parquet 文件 我按照我找到的说明进行操作here https github com apache arrow blob master docs source developers cp
  • Jenkins 执行 PowerShell 脚本

    我正在尝试从 Jenkins 运行 PowerShell 脚本 但它似乎完全忽略了执行策略 可以通过直接执行 powershell exe 或使用PowerShell插件 https wiki jenkins ci org display
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0

随机推荐

  • PoweShell Win_server install wsl

    什么是 WSL 2 WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本 xff0c 它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件 它的主要目
  • PoweShell Win_desktop install wsl

    什么是 WSL 2 WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本 xff0c 它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件 它的主要目
  • Linux Shell 实现一键部署二进制go+caddy+filebrowser

    filebrowser filebrowser 是一个使用go语言编写的软件 xff0c 功能是可以通过浏览器对服务器上的文件进行管理 可以是修改文件 xff0c 或者是添加删除文件 xff0c 甚至可以分享文件 xff0c 是一个很棒的文
  • PowerShell install go+caddy+filebrowser+nssm 实现部署文件系统

    filebrowser filebrowser 是一个使用go语言编写的软件 xff0c 功能是可以通过浏览器对服务器上的文件进行管理 可以是修改文件 xff0c 或者是添加删除文件 xff0c 甚至可以分享文件 xff0c 是一个很棒的文
  • Linux Shell 实现一键部署http+用户名密码登录

    Apache 前言 Apache 音译为阿帕奇 是世界使用排名第一的Web服务器软件 它可以运行在几乎所有广泛使用的计算机平台上 xff0c 由于其跨平台和安全性被广泛使用 xff0c 是最流行的Web服务器端软件之一 它快速 可靠并且可通
  • PowerShell install 一键部署http+用户名密码登录实现文件系统

    Apache 前言 Apache 音译为阿帕奇 是世界使用排名第一的Web服务器软件 它可以运行在几乎所有广泛使用的计算机平台上 xff0c 由于其跨平台和安全性被广泛使用 xff0c 是最流行的Web服务器端软件之一 它快速 可靠并且可通
  • [python]异常处理与try语句

    文章目录 异常处理try语句异常信息抛出异常 异常类型自定义异常预定义异常 使用 try except else 来捕获异常 xff0c 且要求异常必须继承自Exception类 异常处理 运行期检测到错误称为异常 try语句 python
  • 大杂烩·OSI和TCP/IP协议与ZigBee技术·一

    1 ZigBee技术 ZigBee是基于IEEE802 15 4标准的低功耗局域网协议 根据国际标准规定 xff0c ZigBee技术是一种短距离 低功耗的无线通信技术 这一名称 xff08 又称紫蜂协议 xff09 来源于蜜蜂的八字舞 x
  • Linux Shell 实现一键部署subversion

    subversion SVN是subversion的缩写 xff0c 是一个开放源代码的版本控制系统 xff0c 通过采用分支管理系统的高效管理 xff0c 简而言之就是用于多个人共同开发同一个项目 xff0c 实现共享资源 xff0c 实
  • PowerShell install 一键部署TortoiseSVN

    TortoiseSVN TortoiseSVN是 Subversion 版本控制系统的一个免费开源客户端 xff0c 可以超越时间的管理文件和目录 文件保存在中央版本库 xff0c 除了能记住文件和目录的每次修改以外 xff0c 版本库非常
  • PowerShell install 一键部署subversion

    subversion SVN是subversion的缩写 xff0c 是一个开放源代码的版本控制系统 xff0c 通过采用分支管理系统的高效管理 xff0c 简而言之就是用于多个人共同开发同一个项目 xff0c 实现共享资源 xff0c 实
  • ROS(1)安装

    1 ros安装 安装过程参考https www cnblogs com letisl p 11815191 html安装wsl略 xff0c 利用mobaxterm进行连接与可视化 1 1 添加源 sudo sh c 39 etc lsb
  • ROS(11)move_base详解

    11 move base详解 11 1 move base配置参数解读 参考链接 xff1a https blog csdn net banzhuan133 article details 90239252 https wenku baid
  • vscode c/c++ global插件实现代码跳转

    问题 在打开某些大的工程 xff0c 如ROS时 xff0c 有些类成员或接口无法进行自动跳转 xff0c 比较难受 vscode插件安装 安装C C 43 43 GNU Global插件 安装C 43 43 Intellsense插件 G
  • gammaray剖析QT程序——如何解析qt版本不同的exe

    gammaray是个非常牛逼的工具 xff0c 但是当我们要分析的exe和当前编译gammaray不一致时 xff0c 是没法使用的 方法很简单 xff0c 其实版本和exe无关 xff0c 和exe依赖的qt dll库有关 xff0c 我
  • do{}while(0)用法

    linux内核和其他一些开源的代码中 xff0c 经常会遇到这样的代码 xff1a do while 0 这样的代码一看就不是一个循环 xff0c do while表面上在这里一点意义都没有 xff0c 那么为什么要这么用呢 xff1f 实
  • windows下vscode安装go插件

    1 GIT安装 vscode安装 略 2 GO在win下安装及环境变量配置 安装完GO后 xff0c 创建一个目录作为工作区 xff0c 如G my project go xff0c 环境变量添加GOPATH并指向该目录 在该目录下创建三个
  • GDB调试中 如何在so共享库中打断点、保存断点以及加载断点

    最近在使用gdb的过程中 xff0c 需要对so文件进行调试 xff0c 在这里记录一下调试中的问题及解决方法 如何在so源文件中打断点 xff1f 首先编译so时需要 g指令 在gdb xxx指令后 xff0c 发现无法在so对应的源码文
  • [Net]SSE消息推送简介

    文章目录 SSE网络协议客户端服务端事件 SSE示例客户端服务端 SSE xff08 Server Sent Events xff09 是一种服务端到客户端 xff08 浏览器 xff09 的单向消息推送方式 SSE网络协议 SSE是基于H
  • 记录一次Windows下通过reimp和dlltool转换.lib到.a的过程

    背景是这样的 xff1a 在linux下的一个C 43 43 服务由于特殊原因 xff0c 需要在windows下跑 xff0c 该工程为cmake搭建 xff0c 用到了qt的一些基础库 xff0c 我们想在qtcreator中用ming