3 回答
TA贡献1776条经验 获得超12个赞
Microsoft 在VS 2015中重构了大部分C运行时和库。某些功能不再从C库导出(某些功能在C头文件中定义)。Microsoft具有一些兼容性库,例如legacy_stdio_definitions.lib和legacy_stdio_wide_specifiers.lib,但您也可以选择将较早的Visual Studio 2013平台工具集与较早的C库一起使用。
要更改平台工具集:下拉Project菜单;选择Properties...; 转到Configuration Properties/ General,然后更改Platform Toolset为Visual Studio 2013(v120)
TA贡献1963条经验 获得超6个赞
似乎可以对Visual Studio 2015 Toolset进行一些修改。
您需要将以下库添加到依赖项中:libcmt.lib,libvcruntime.lib,libucrt.lib,legacy_stdio_definitions.lib。或者,您可以includelib用来将这些库包含在程序集文件中。
为您的过程指定C调用约定mainPROC C
在文件末尾(这很重要)不要使用end main,而end只能使用。不解决此问题可能会导致意外崩溃。
尽管我们可以使用ExitProcess退出我们的应用程序,但是我们也可以将返回代码放入EAX中并做一个ret返回。该Ç运行时调用我们的main功能,并在返回时将调用关机代码为我们。
代码看起来像:
.586
.model flat, stdcall
option casemap:none
includelib libcmt.lib
includelib libvcruntime.lib
includelib libucrt.lib
includelib legacy_stdio_definitions.lib
ExitProcess PROTO return:DWORD
extern printf:NEAR
.data
text BYTE "Text", 0
.code
main PROC C ; Specify "C" calling convention
push offset text
call printf
add esp, 4
; invoke ExitProcess,0 ; Since the C library called main (this function)
; we can set eax to 0 and use ret`to have
; the C runtime close down and return our error
; code instead of invoking ExitProcess
mov eax, 0
ret
main ENDP
end ; Use `end` on a line by itself
; We don't want to use `end main` as that would
; make this function our program entry point
; effectively skipping by the C runtime initialization
TA贡献1794条经验 获得超7个赞
您可以调用C函数,但随后需要与C库链接。确切的实现方式取决于您要链接的C库。我建议您找到一个最小的C运行时,例如WCRT库。
该库可能需要初始化,并且可能需要您在其某个地方定义一堆缓冲区以进行记账。
建议您不要使用Windows API,而是使用WriteConsole函数,而不要麻烦这些麻烦。
- 3 回答
- 0 关注
- 652 浏览
添加回答
举报