Unresolved external symbol _main

Тема в разделе "WASM.BEGINNERS", создана пользователем Crash, 30 янв 2007.

  1. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Привет всем!

    Следующий код я собираю так:
    C:\masm32\bin\ml /nologo /c /coff main.asm
    C:\masm32\bin\link /nologo main lib\libc.lib lib\kernel32.lib

    Но линкер выдает ошибку:
    libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
    main.exe : fatal error LNK1120: 1 unresolved externals

    Видимо, он не видит точку входа. Как можно ему ее указать?
    Пробовал /entry в опциях линкера, но скомпилированная программа при запуске падает,
    не выводя ничего.

    Код (Text):
    1. .586p
    2. .model flat, stdcall
    3. option casemap :none   ; case sensitive
    4.  
    5. include C:\masm32\include\windows.inc
    6. include C:\masm32\include\masm32.inc
    7. include C:\masm32\include\kernel32.inc
    8. include C:\masm32\macros\macros.asm
    9.  
    10. includelib C:\masm32\lib\masm32.lib
    11. includelib C:\masm32\lib\kernel32.lib
    12.  
    13. EXTRN printf:PROC
    14.  
    15. .data
    16. test_string db "Hello, World!", 0
    17.  
    18. .code
    19.  
    20. main PROC NEAR
    21.     push OFFSET test_string
    22.     call printf
    23.     exit
    24. main endp
    25. end
     
  2. slackhead

    slackhead New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    66
    1) в масме традиционно точка входа увазывается после слова end, т.е. в твоём случае нужно писать end main
    обычно объявляют метку старт. так же её можно объявить через /ENTRY линкеру
    2) падает потому что printf это функция из библиотеки C которая нуждается в инициализации..
    В С программах где используються рантаймовые функции, оригинальная точка входа не твоя main а тоже рантайвовская функция которая производит инициализацию, значит либо юзай функции кернела либо казывай точку входа рантаймовской функции.. называются они если память не изменяет mainCRTStartup для консолького приложения и WinMainCRTStartup для gui
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    slackhead
    Если это динамическая версия MSVCRT, то никакой дополнительной инициализации для успешного использования printf не нужно.