【发布时间】:2016-02-16 16:56:49
【问题描述】:
我在从 Visual Studio(Win10 x64、Visual Studio 2015)中创建的 asm 项目调用 C 函数时遇到问题。项目由一个 asm 文件组成:
.586
.model flat, stdcall
option casemap:none
includelib msvcrt.lib
ExitProcess PROTO return:DWORD
extern printf:near
.data
text BYTE "Text", 0
.code
main PROC
push offset text
call printf
add esp,4
invoke ExitProcess,0
main ENDP
end main
当我构建项目时,链接器输出错误:
错误 LNK2019 未解析的外部符号 _printf 在中引用 函数_main@0
链接器输出参数:
/OUT:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.exe" /清单:否 /NXCOMPAT /PDB:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pdb" /DYNAMICBASE “kernel32.lib” “user32.lib” “gdi32.lib” “winspool.lib” “comdlg32.lib” “advapi32.lib” “shell32.lib” “ole32.lib” “oleaut32.lib” “uuid.lib” “odbc32.lib” “odbccp32.lib” /MACHINE:X86 /SAFESEH:NO /增量:否 /PGD:"C:\Users\apple\Documents\SP_Lab7\Debug\SP_Lab7_Demo.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\SP_Lab7_Demo.exe.intermediate.manifest" /错误报告:提示 /NOLOGO /TLBID:1
如果我评论call print,那么一切都会正常执行(甚至是 Windows API 函数)。有没有办法从 asm 文件调用 C 函数而不创建包含<cstdio> 的 cpp 文件?
有可能吗?
【问题讨论】:
-
解决方法是将
platform toolset设置为 VS 2013。为此,下拉Project菜单选择properties...。转到Configuration Properties/General,将Platform Toolset更改为Visual Studio 2013 (v120) -
@MichaelPetch 真的很有效,谢谢
-
Microsoft 重构了 C 运行时的大部分内容。一些函数不再在库中导出(一些在 C 头文件中定义)。 MS 有一些兼容性库 legacy_stdio_definitions.lib 和 legacy_stdio_wide_specifiers.lib ,但我还没有让 printf 使用它们,所以我回退到 VS 2013 工具集。可能还有其他解决方法,但我还没有看到。
-
我添加了一个新答案,其中包含您可能有兴趣尝试的解决方案。它使用 Visual Studio 2015 工具集。在尝试之前,您必须从 Visual Studio 2013 工具集切换到 2015。如果这对你有用,我非常好奇。
标签: visual-studio assembly x86 linker-errors masm