gcc、静态库、外部汇编函数变成未定义符号

2024-03-22

我在 g++ 构建链接到静态库的应用程序时遇到问题,其中静态库应包含一些用外部 asm 文件编写的全局函数,并使用 yasm 编译。所以在图书馆里,我有

#ifdef __cplusplus
extern "C" {
#endif

extern void __attribute__((cdecl)) interp1( char *pSrc );
extern void __attribute__((cdecl)) interp2( char *pSrc );

#ifdef __cplusplus
}
#endif

我在图书馆内的其他地方引用了它。然后,在 asm 文件中实现,如下所示:

section .data
; (some data)
section .text
; (some text)

global _interp1
_interp1:
    ; (code ...)
    ret

global _interp2
_interp2:
    ; (code ...)
    ret

编译和链接对于库来说工作得很好,我这样做

yasm -f elf32 -O2 -o interp.o interp.asm

进而

ar -rc libInterp.a objs1.o [...] objsN.o interp.o 
ranlib libInterp.a

现在最后,为了将库链接到主应用程序,我这样做

g++ -O4 -ffast-math -DNDEBUG -fomit-frame-pointer -DARCH_X86 -fPIC -o ../bin/interp this.o that.o -lboost_thread -lpthread ./libInterp.a 

我得到了错误

undefined reference to `interp1'
undefined reference to `interp2'

我在这里做错了什么?任何帮助表示赞赏。


根据目标类型,gcc 不会在外部符号前面添加前导下划线。您的情况似乎就是这种情况。

简单的修复可能是从程序集文件中的名称中删除下划线。

您可能会考虑的几个替代方案可能是对汇编文件中的符号使用类似以下宏之一的内容:

  • from http://svn.xiph.org/trunk/oggdsf/src/lib/codecs/webm/libvpx/src/vpx_ports/x86_abi_support.asm http://svn.xiph.org/trunk/oggdsf/src/lib/codecs/webm/libvpx/src/vpx_ports/x86_abi_support.asm

    ; sym()
    ; Return the proper symbol name for the target ABI.
    ;
    ; Certain ABIs, notably MS COFF and Darwin MACH-O, require that symbols
    ; with C linkage be prefixed with an underscore.
    ;
    %ifidn   __OUTPUT_FORMAT__,elf32
    %define sym(x) x
    %elifidn __OUTPUT_FORMAT__,elf64
    %define sym(x) x
    %elifidn __OUTPUT_FORMAT__,x64
    %define sym(x) x
    %else
    %define sym(x) _ %+ x
    %endif
    
  • from http://www.dcs.warwick.ac.uk/~peter/otherstuff.html http://www.dcs.warwick.ac.uk/~peter/otherstuff.html

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

gcc、静态库、外部汇编函数变成未定义符号 的相关文章

随机推荐

  • PHP mySQL - 将新记录插入到主键自动增量的表中

    想知道是否有一个速记版本可以将新记录插入到启用了主键的表中 即不必在查询中包含键列 假设键列称为 ID 其他列是 Fname Lname 和 Website query INSERT INTO myTable VALUES Fname Ln
  • Informix for .NET 的连接字符串

    我们正在使用 Informix 数据库 并使用 ODBC 从 NET 成功连接到它 我们使用的连接字符串是 DRIVER IBM INFORMIX ODBC RIVER UID username PWD password DATABASE
  • 如何为apache http客户端中的所有请求设置默认标头?

    例如 默认用户代理可以设置为 client getParams setParameter CoreProtocolPNames USER AGENT someName 但是如何设置 Accept 标头呢 HttpClient 4 3 现在允
  • Seaborn Lineplot 模块对象没有属性“Lineplot”

    使用seaborn的文档代码生成线图会返回AttributeError module 对象没有属性 lineplot 我已经更新了seaborn并重新导入了模块并再次尝试 没有运气 lineplot 退役了吗 还是有其他事情发生 impor
  • c# socket接收字节数组长度

    我正在尝试学习在 C 中使用套接字 但我有疑问 我正在使用如下代码 byte data new byte 64 int length 0 length sock Receive data more code So the byte data
  • 指定的密钥太长;最大密钥长度为 767 字节 - ASPNet Identity MySQL

    我使用 Identity 和 MySQL 创建了一个 MVC 应用程序 我已经创建了实体 但是当我创建用户表时 它失败并出现标题中指定的错误 我四处搜寻 人们都说UserName Name and Email属性太长 我已经厌倦了在这些列上
  • EOT 必须位于队列的开头吗?

    if if echo lt lt
  • Nodejs 和 Express 中的 Multer 图像上传

    几天来我一直在尝试使用 Multer 上传图像 这就是我已经走了多远 我尝试了多种方法 但似乎无法使其发挥作用 我不知道如何使用 Multer 在 createUser 函数中按如下所示的格式上传图像 我的 server js 文件 var
  • R 中的神经网络 - 为所有输入值获取相同的输出

    我正在尝试准备一个神经网络来根据两个参数 否 和 年龄 来预测产品的索赔数量 以下数据集是神经网络的输入 structure list no c 25305 4104099149 49282 7650363303 71596 1615884
  • 是否可以在 mysql 中散列整个结果集?

    是否可以将哈希函数应用于 mysql 中的整个结果集 我知道如何对结果集的每一行中的值进行哈希处理 e g SELECT md5 something 不过 假设我有一个查询 例如 SELECT FROM some table 结果集包含很多
  • 使 JTable 单元格编辑器值可选择,但不可编辑?

    我已经尽力保持我的JTable紧密且安全 仅可编辑列可通过isCellEditable 然而 我的客户坚持要求他们双击某个单元格 以便复制其内容 即使它是只读的 我可以让单元格可编辑 并且不对他们可以在setValueAt 因此当编辑器退出
  • 值等于数组中的任何值吗?

    只是想知道是否有任何方法可以检查值 A 是否等于数组中的任何值 不使用大循环函数 有点像 Where 函数 e g if DataRow column1value
  • 使用 jetpack EncryptedFile 安全性进行图像加密

    谷歌介绍安全加密jetpack库 https developer android com topic security data 我想使用这个库来加密图像文件 在库的文档中没有用于加密图像文件的示例 我将图像转换为位图 位图转换为字节数组
  • 点击叠加时显示标注

    我有一个带有多个叠加层的 MKMapView 一切都很好 而且它的工作原理是如此简单 令人难以置信 然而 有一件事我无法去上班 这个想法很简单 当用户在覆盖层覆盖的区域内点击时 必须出现包含有关该覆盖层的一些信息的标注 叠加都是MKPoly
  • 高效访问任意深度的字典

    假设我有一个像这样的多级字典 mydict first second third fourth the end 我想像这样访问它 test get entry mydict first second third fourth 到目前为止我所
  • 保存张量流对象检测增强图像

    有没有办法在所有预处理 增强之后查看tensorflow对象检测api训练的图像 我想验证一下事情看起来是否正确 我能够通过查看推论中调整大小的图表来验证调整大小 但显然我无法对增强选项执行此操作 过去使用 Keras 我已经能够做到这一点
  • 如何向 UITableView 单元格添加图像?

    我临时添加了一些值UITableViewCell以编程方式 但我需要向每个单元格添加图像 我怎样才能做到这一点 这是我的代码 h 文件 interface BidalertsViewController UIViewController
  • 如何将 jstring 转换为 wchar_t *

    假设在 C 方面 我的函数采用类型变量jstring named myString 我可以将其转换为 ANSI 字符串 如下所示 const char ansiString env gt GetStringUTFChars myString
  • 身体下方的空白区域和 div 的奇怪位置[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在为朋
  • gcc、静态库、外部汇编函数变成未定义符号

    我在 g 构建链接到静态库的应用程序时遇到问题 其中静态库应包含一些用外部 asm 文件编写的全局函数 并使用 yasm 编译 所以在图书馆里 我有 ifdef cplusplus extern C endif extern void at