当作为 *.a 静态库链接时,为什么“WinMain”无法解析?

2024-02-04

给定一个简单的程序:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, 
                   LPSTR lpCmdLine, int nCmdShow)
{
  return 0;
}

如果我跑g++ a.cpp效果很好。

然而,运行g++ -c a.cpp && ar rcs a.a a.o && g++ a.a给出以下错误:

c:/mingw32/bin/../lib/gcc/i686-w64-mingw32/4.8.1/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

任何关于为什么会发生这种情况的见解?如何链接仅包含 .a 文件的程序?


The gcc ld链接器句柄*.a静态库与*.o对象文件。特别是静态库中的符号do not除非先前链接的目标文件或另一个静态库使用它,否则将被包含到最终的二进制映像可执行文件中。

此外,您在静态库中传递的顺序也很重要ld。例如,说libb.a需要一个函数liba.a。如果你像这样链接它:

g++ -Wall 示例.cpp -o 示例.exe -la -lb

这将无法解决,因为当liba已处理它看不到什么符号-lb需要 (libb尚未处理)。唯一检索到的符号liba.a是它所看到的一切那一点.

为什么这很重要?

如果您将上述过程应用于您的问题,就会清楚为什么WinMain没有得到解决。

g++ a.a

When ld流程a.a它说“哦,什么都没用WinMain所以我不会包括它”;这在处理点上是正确的,因为在它之前没有提供其他目标文件。

上面你看不到的是 mingw 默认情况下,还包括程序运行所需的一堆重要的样板代码。其中之一是crt0_c.o from mingw32.a它构成了 mingw 运行时的一部分does打电话给你的WinMain.

解决方案

有两种方法可以确保WinMain从你的a.a被包括在内:

  1. Use -Wl,--whole-archive强制包含所有符号a.a因此它们可用于符号解析。附加-Wl,--no-whole-archive之后,这样它就不会错误地将其应用于之后的其他库。例如。

    g++ -o example.exe -Wl,--whole-archive a.a -Wl,--no-whole-archive
    
  2. 第二种方法是包含mingw32.a手动before a.a so WinMain成为待处理的未解析符号时a.a被处理:

    g++ -o example.exe -lmingw32 a.a
    

    or

    g++ -o example.exe libmingw32.a a.a
    

但您可能需要完全限定路径libmingw32.a否则链接器将找不到它。

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

当作为 *.a 静态库链接时,为什么“WinMain”无法解析? 的相关文章

  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 向 bison/jison 计算器语言添加函数

    我正在尝试扩展吉森计算器示例 http zaach github io jison try 具有一些简单的功能 我对解析和 bison jison 相当陌生 但这是我到目前为止所拥有的一些内容 lexical grammar lex var
  • History.js 有没有办法知道何时按下后退按钮

    我已经开始测试历史 js https github com balupton history js 在了解了它的工作原理并且没有popstate 而是有statechange 我正在寻找一种在按下浏览器后退按钮时有所不同的方法 原因是我需要
  • Linux 上的 Squeak SMTP

    我正在使用 Squeak 5 类 SecureSMTPClient 通过 SSL TLS 发送电子邮件 它在我的 Windows 机器上运行良好 感谢答案那个问题 https stackoverflow com questions 3761
  • 使用可变长度数组有任何开销吗?

    使用可变长度数组有一些开销吗 数组的大小可以在运行时通过命令行参数传递吗 与自动和动态分配数组相比 为什么要引入它 VLA 确实有一些开销 与 普通 命名的编译时大小的数组相比 首先 它具有运行时长度 而且该语言为您提供了在运行时获取数组实
  • 从返回响应数据的 Fetch Post 获取数据

    我在带有 redux 的 React 应用程序中使用交叉获取 在我的减速器中 我使用 cross fetch 的 post 方法将一些数据保存到数据库中 我的调用返回一个响应 其中包含一些我需要在保存后分配给状态的数据 但我在解析数据时遇到
  • 当我直到运行时才知道长度时,如何声明数组?

    我最初有一个数组 1 1000 它被定义为全局变量 但现在我需要它是 n 而不是 1000 直到后来我才找到 n 在填充数组之前我知道 n 是什么 但我需要它是全局的 因此需要一种在运行时定义全局数组的大小的方法 上下文是通过文件中字节的线
  • 电话号码中的正则表达式可选空格[重复]

    这个问题在这里已经有答案了 可能的重复 用于电话号码验证的综合正则表达式 https stackoverflow com questions 123559 a comprehensive regex for phone number val
  • Pig 和 Hive 之间的区别?为什么两者都有? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的背景 进入 Hadoop 世界已经 4 周了 使用 Cloudera 的 Hadoop VM 涉足 Hive Pig 和 Hadoop 读过
  • 片段着色器 - 确定整个(单色)图像的最小/最大值并使用它们进行进一步的像素操作

    我想正常化单色图像像素以这种方式最小值为黑色 最大值为白色 并且两者之间的值按比例分布 目前我在 canvas 中分两步完成 但我相信在 WebGL 中应该更快 我可以想象通过片段着色器操纵颜色 但我找不到任何有效的方法来 1 确定图像的实
  • 如何在 IE11 中显示 html5 视频元素的控件?

    IE11 也可能是 10 不会显示视频控件 直到您将鼠标悬停在视频本身上 就我个人而言 我认为完全没有用 特别是当您也使用海报元素时 因为用户无法知道图像实际上是视频 有没有办法像 Chrome 一样 强制 IE 显示控件 我使用的代码是
  • ServiceStack CredentialAuthProvider 具有多个用户/密码

    我想使用自定义身份验证提供程序 但我不知道如何使标准身份验证内容处理更多用户和密码作为参数 这可以做到吗 取决于您想要做什么 如果您想通过继承 Credentials AuthProvider 创建自己的自定义身份验证提供程序 您可以通过以
  • 获取c++ windows中每个进程使用的磁盘

    I am trying to build a tool which is something similar to Task Manager I was able to get the CPU and Memory of each proc
  • Xcode 中的 XCBUtil.PropertyListConversionError

    当我尝试运行我的项目时 出现此错误 指向我的本地化 strings 文件 读取失败 操作无法完成 XCBUtil PropertyListConversionError错误1 我可以做什么来解决这个问题 错误所指向的 string 文件内存
  • 计算子集的唯一交集

    Given a set S si zj z N what is a time efficient algorithm for computing the unique sets of intersections of the subsets
  • Ivy:使用动态修订

    我在理解如何使用动态修订版时遇到问题Ivy http ant apache org ivy 在我的 Java 项目中有效 目前 我有以下布局 lib a revision 1 0 0 status release dependencies
  • Powershell启动作业同步输出

    我有一个启动作业的 powershell 脚本 start job scriptblock while true echo Running Start Sleep 2 然后它继续执行脚本的其余部分 该工作是一种对该进程 PID 的监控工作
  • Apache 用户帐户无密码访问服务器 - Ubuntu

    我有同样的问题this https stackoverflow com questions 9089350 rsync via php exec with ssh passwordless ssh login问题 如果我再解释一遍 我可以使
  • 前向声明类成员的前向声明

    是否可以前向声明一个在另一个前向声明的类中声明的类 基本上 我有这样的东西 A h class A struct B 现在我想声明另一个这样的类 Q h class A struct A B class Q A B Foo 不 这是不可能的
  • 在 WordPress 中获取类别 ID 数组?

    cats get categories array order gt ASC orderby gt id hierarchical gt 0 hide empty gt 0 taxonomy gt edu year 我想生成一个变量 其中包
  • 当作为 *.a 静态库链接时,为什么“WinMain”无法解析?

    给定一个简单的程序 include