如何从 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#)

visual studio 无法引用第三方库?

如何在我的 C# Visual Studio 项目中添加 VC++ DLL 作为引用?

为啥在 Visual Studio 中构建失败,因为它无法从引用的程序集中解析命名空间?

如何在 Visual Studio 2010 中正确引用 dll?

visual studio怎么添加对dll的引用