【问题标题】:How to resolve the symbol of "printf" instead of "_printf" on win32 console?如何在win32控制台上解析“printf”而不是“_printf”的符号?
【发布时间】:2014-01-09 18:39:08
【问题描述】:

测试平台是windows 32bit。

所以基本上我想在这些命令中组装+链接一个sn-p的汇编代码:

nasm -fwin32 test.s
cl test.obj /link msvcrt.lib 

上面写着:

error LNK2001: unresolved external symbol printf

在我的代码中,我确实有这样的函数调用:

call printf

所以我把这些都改成了

call _printf

它有效。

我不熟悉windows上的编程,但是有没有办法解决printf的外部符号?

因为我在做一些自动转换的任务,而所有以_开始的函数调用的转换应该是非常繁琐的...

谁能给我一些帮助..?谢谢!

【问题讨论】:

标签: windows winapi assembly dll


【解决方案1】:

MSVCRT 与使用 Visual C++ 编译的所有内容一样,导出 cdecl 函数 using an underscore prefix。对于您自己的库,您可以override this behaviour,但由于 MSVCRT 不是您的库,您无法更改。

您确实必须让您的程序集调用使用下划线名称。但是 nasm 有一个选项,--prefix,这使得这更容易:--prefix _。 (感谢 Frank Kotler 提到这一点。)

【讨论】:

  • Nasm 有一个特性......需要两个连字符的少数选项之一:--prefix _,如果有帮助,它将在声明为 globalextern 的任何内容上加上下划线。
  • @Frank Nice,感谢您提供的信息。你想让我把它折叠成我的答案吗?
  • 当然!去吧!不妨注意,对于 OpenWatcom:--postfix _ - 是的,OpenWatcom 使用尾随下划线...
  • 谢谢你们的回答!他们真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 2023-03-14
相关资源
最近更新 更多