- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
假设我有一个对象的多个定义,这些定义跨不同的对象文件定义,并且我想将它们链接在一起。似乎有两种方法可以选择在将这些目标文件链接在一起时使用哪个定义:将符号标记为弱,或将其放在它自己的 COMDAT 部分(在每个目标文件中)。
根据我的理解(这可能是错误的),弱链接允许通过符号的一个定义覆盖另一个取决于链接顺序的定义。 COMDAT 通过将符号放在唯一的 COMDAT 部分并在链接时选择要使用的部分来允许多个定义。
有人告诉我这些是彼此正交的概念,但不确定为什么要同时使用两者而不是只使用其中一个。对于一个更具体的例子,我相信 c++ 中没有键函数的虚拟表在它们使用的所有模块中都定义了,并且这些模块可以链接在一起,因为 vtable 本身被声明为弱的并且在它自己的 COMDAT 中。
最佳答案
but wasn't sure why one would use both instead of just one of them.
当一个函数有不同(即不等同)可能的实现时,最常使用弱链接。
例如,libc.a
可以提供 pthread_mutex_lock
的弱定义,它什么都不做,而 libpthread.a
将提供一个 strong 相同函数的定义,该函数实际上确实锁定了互斥量。
用户代码(main.o
)可以盲目调用pthread_mutex_lock
,正确的事情会发生取决于libpthread.a
是否是链接与否。
如果链接器可以自由选择 pthread_mutex_lock
(如果它们都是 COMDAT 符号就会发生这种情况),这显然是行不通的。
关于c++ - 弱链接与使用 COMDAT 部分有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57378828/
我正在为 Windows 二进制文件编写一个链接器,目前正致力于实现 COMDAT。我想我理解大部分规范,除了 COMDAT 部分的三个记录(部分标题、部分符号和辅助符号),规范似乎没有提到存储在其中
我看到/Gy 选项,想知道为什么要使用它? http://msdn.microsoft.com/en-us/library/xsa71f43.aspx 最佳答案 COMDAT 节的目的是允许在多个对象
当使用 Microsoft 编译器编译和链接 C 代码时,不同目标文件中具有相同名称的定义根据定义的类型有多种可能的结果。 int x[5] = {1}; int x[5] = {1}; 两个初始化的
假设我有一个对象的多个定义,这些定义跨不同的对象文件定义,并且我想将它们链接在一起。似乎有两种方法可以选择在将这些目标文件链接在一起时使用哪个定义:将符号标记为弱,或将其放在它自己的 COMDAT 部
这个问题在 SO 上有一些答案,但我的略有不同。在标记为重复之前,请试一试。 MSVC 一直提供/Gy 编译器选项,以允许将相同的函数折叠到 COMDAT 部分中。同时,链接器还提供了/OPT:ICF
这是我从 dumpbin AchievementsTable.obj /HEADERS 得到的输出 Microsoft (R) COFF/PE Dumper Version 8.00.50727.76
只是好奇,GCC 或 Clang 工具集是否实现了等效于 MSVC 的 identical COMDAT folding (ICF) 目前?如果没有,有什么计划吗?除了旧的 GCC 邮件列表消息之外,
当我链接我的项目时,我收到了这个错误, COMMUNICATION.obj : fatal error LNK1179: invalid or corrupt file: duplicate COMD
我在一台 Windows 10 机器上,我有 2 个文件,main.cpp 和 cuda.cu(我已经在 Ubuntu 上成功构建了这个项目,我正试图让它在 Windows 上构建)。我将它们都编译成
我是一名优秀的程序员,十分优秀!