我在 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(使用前将#替换为@)