_main уже определен в file.obj - PullRequest
0 голосов
/ 16 ноября 2011

Я читаю книгу, которая учит сборке с использованием MASM через Visual C ++ Express.

В книге приведен следующий пример программы для проверки работоспособности masm

    .386
    .model flat, c
    .stack 100h
printf PROTO arg1:Ptr Byte, printlist:VARARG
    .data
msg1fmt byte "%s%d",0Ah,0
msg1 byte "The answer is: ",0
num1 sdword ?
num2 sdword ?
    .code
main proc
    mov num1,5
    mov eax,num1
    mov num2,eax
    INVOKE printf, ADDR msg1fmt, ADDR msg1, num2
    ret
main endp
    end

Затем я получаю сообщение об ошибке LNK2005: _main уже определен в asm.obj

Я использую пример программы сборки из моей книги, так что, надеюсь, это не ошибка. Похоже, ошибка, которую я получаю, как-то связана с тем, что main была указана дважды, но я не знаю, как ее устранить.

1 Ответ

1 голос
/ 17 ноября 2011

Не исключено, что примеры программирования в книгах могут быть ошибочными.

Обратите внимание, что ошибка, которую вы получаете, связана с компоновщиком , а не с ассемблер .Тот факт, что вы зашли так далеко, уже показывает, что ассемблер доволен вашим файлом, и действительно, ваш файл сборки определяет main только один раз.

Я не знаком со средствами разработки MS, особенноза последние полтора десятилетия, но я представляю, что либо вы добавили в свой проект модуль C или C ++, который определяет main() как функцию на этом языке, либо IDE «услужливо» предоставляет определение по умолчанию.Именно это второе определение main вызывает недовольство компоновщика.

(Символ подчеркивания в сообщении об ошибке компоновщика является просто артефактом того, как вы работаете на этой платформе - все символы HLL получают префиксПодчеркивая, у вас есть .model flat, <strong>c</strong> - это может указывать MASM на префикс символов, несмотря на то, что ассемблер не является языком высокого уровня.)

Вы можете попробовать найти определение main() вC-Land часть вашего проекта и просто удалить его или исключить из проекта, если вы можете найти его.В противном случае переименуйте вашу ассемблерную функцию, скажем, в asm_main, а затем вызовите , что из C-land:

int main() {
  return asm_main();
}

(Это просто для того, чтобы вы пошли; если выхотите овладеть argc и др., вам нужно стать более креативным.)

...