如何从 C 中引用在 Visual Studio 的 .asm 文件中定义的全局变量
Posted
技术标签:
【中文标题】如何从 C 中引用在 Visual Studio 的 .asm 文件中定义的全局变量【英文标题】:how to reference global variable from C that was defined in .asm file in visual studio 【发布时间】:2021-01-26 04:34:07 【问题描述】:我有一个定义变量 foo
的 .asm 文件
文件.asm:
.data
foo DWORD 0
.code
...
我想在 main.c 中的 file.asm 之外引用 foo
,这是我尝试过的:
main.c
extern int foo;
int main()
foo++;
但是这会导致链接器错误:LNK2001 unresolved external symbol foo
,我如何从 main.c 引用它?
更新:
我也尝试过使用 PUBLIC 指令:
文件.asm:
.data
PUBLIC foo
foo DWORD 0
这会导致相同的链接器错误 LNK2001
【问题讨论】:
究竟是什么编译行+错误? @OrenIshShalom 编辑了问题以包含错误 【参考方案1】:MSVC 在符号名称的开头使用下划线,并且显然使用 PUBLIC
来导出符号(否则标签是内部的,如 C 中的 static
变量)。试试
.data
PUBLIC _foo
_foo DWORD 0
这本质上是 MSVC 本身所做的,请参阅 https://godbolt.org/z/Phb4Pv
【讨论】:
请注意,Windows 上的 64 位代码不会在 asm 符号名称上使用前导_
,因此在这种情况下,您会需要 public foo
。这个答案对于 32 位代码是正确的。 (尽管使用零初始化器,您可以将其放在 BSS 中而不是 .data 中)。以上是关于如何从 C 中引用在 Visual Studio 的 .asm 文件中定义的全局变量的主要内容,如果未能解决你的问题,请参考以下文章
压缩文件后(它们从 Visual Studio 中的文件路径引用打开),如何让我的应用程序从单独的 Winform 打开? (C#)
如何在我的 C# Visual Studio 项目中添加 VC++ DLL 作为引用?
为啥在 Visual Studio 中构建失败,因为它无法从引用的程序集中解析命名空间?