3 回答

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
Microsoft 在VS 2015中重構(gòu)了大部分C運(yùn)行時(shí)和庫。某些功能不再從C庫導(dǎo)出(某些功能在C頭文件中定義)。Microsoft具有一些兼容性庫,例如legacy_stdio_definitions.lib和legacy_stdio_wide_specifiers.lib,但您也可以選擇將較早的Visual Studio 2013平臺(tái)工具集與較早的C庫一起使用。
要更改平臺(tái)工具集:下拉Project菜單;選擇Properties...; 轉(zhuǎn)到Configuration Properties/ General,然后更改Platform Toolset為Visual Studio 2013(v120)

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
似乎可以對Visual Studio 2015 Toolset進(jìn)行一些修改。
您需要將以下庫添加到依賴項(xiàng)中:libcmt.lib,libvcruntime.lib,libucrt.lib,legacy_stdio_definitions.lib?;蛘?,您可以includelib用來將這些庫包含在程序集文件中。
為您的過程指定C調(diào)用約定mainPROC C
在文件末尾(這很重要)不要使用end main,而end只能使用。不解決此問題可能會(huì)導(dǎo)致意外崩潰。
盡管我們可以使用ExitProcess退出我們的應(yīng)用程序,但是我們也可以將返回代碼放入EAX中并做一個(gè)ret返回。該?運(yùn)行時(shí)調(diào)用我們的main功能,并在返回時(shí)將調(diào)用關(guān)機(jī)代碼為我們。
代碼看起來像:
.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貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以調(diào)用C函數(shù),但隨后需要與C庫鏈接。確切的實(shí)現(xiàn)方式取決于您要鏈接的C庫。我建議您找到一個(gè)最小的C運(yùn)行時(shí),例如WCRT庫。
該庫可能需要初始化,并且可能需要您在其某個(gè)地方定義一堆緩沖區(qū)以進(jìn)行記賬。
建議您不要使用Windows API,而是使用WriteConsole函數(shù),而不要麻煩這些麻煩。
- 3 回答
- 0 關(guān)注
- 767 瀏覽
添加回答
舉報(bào)