2010-05-12 1 views
4

У меня есть простая программа для приветствия мира C и скомпилируйте ее с помощью/FA. Как следствие, компилятор также генерирует соответствующий список сборок. Теперь я хочу использовать masm/link для сборки исполняемого файла из сгенерированного списка .asm.Вывод сборки компиляции, созданный VC++?

Следующая командная строка дает 3 ошибки компоновщика:

\masm32\bin\ml /I"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include" /c /coff asm_test.asm 
\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib" asm_test.obj 

, указывающие, что функции С-среда выполнения не были связаны с объектных файлов, произведенных ранее:

asm_test.obj : error LNK2001: unresolved external symbol @[email protected] asm_test.obj : error LNK2001: unresolved external symbol _printf LINK : error LNK2001: unresolved external symbol _wmainCRTStartup asm_test.exe : fatal error LNK1120: 3 unresolved externals

Здесь генерируется сборка листинга

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 

    TITLE c:\asm_test\asm_test\asm_test.cpp 
    .686P 
    .XMM 
    include listing.inc 
    .model flat 

INCLUDELIB OLDNAMES 

PUBLIC [email protected][email protected]@[email protected] ; `string' 
EXTRN @[email protected]:PROC 
EXTRN _printf:PROC 
; COMDAT [email protected][email protected]@[email protected] 
CONST SEGMENT 
[email protected][email protected]@[email protected] DB 'hello world!', 0aH, 00H ; `string' 
CONST ENDS 
PUBLIC _wmain 
; Function compile flags: /Ogtpy 
; COMDAT _wmain 
_TEXT SEGMENT 
_argc$ = 8      ; size = 4 
_argv$ = 12      ; size = 4 
_wmain PROC      ; COMDAT 
; File c:\users\octon\desktop\asm_test\asm_test\asm_test.cpp 
; Line 21 
    push OFFSET [email protected][email protected]@[email protected] 
    call _printf 
    add esp, 4 
; Line 22 
    xor eax, eax 
; Line 23 
    ret 0 
_wmain ENDP 
_TEXT ENDS 
END 

Я использую последнюю версию masm32 (6.14.8444).

Update:

Как было предложено Зубчатым, я включил в источнике ассемблерного в INCLUDELIB msvcrt.lib. Программа компилируется и создаются исполняемый файл, но компоновщик генерирует предупреждение:

msvcrt.lib(crtmanifestrtm.obj) : warning LNK4044: unrecognized option "manifestdependency:type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; ignored

Когда я запустить исполняемый файл, среда выполнение C генерирует следующее сообщение об ошибке:

Runtime error: R6034 An application has made an attempt to load the C runtime library incorrectly

+0

Вы предоставили путь к библиотекам, но вы не указали ни одну из самих библиотек, к которой вы хотите привязать. Я не уверен, имя библиотек, на которые вам нужно будет ссылаться, хотя (следовательно, комментарий вместо ответа). – Cogwheel

+1

Возможно, msvcrt.lib? – Cogwheel

+1

Ну, это, безусловно, имеет какое-то отношение к файлам манифеста, но в этом я довольно сильно застенчив. Может быть, создать простой простой проект на C++ и просмотреть настройки компоновщика для подсказок? – Cogwheel

ответ

0

Вот лучше ссылки для сборки с ЭЛТ 9

http://www.masm32.com/board/index.php?topic=9231.0

+0

Не уверен на 100%, но я думаю, что эта информация относится к 'MSVCRT.DLL', которая поставляется с Windows. Который не имел бы функцию cookie проверки безопасности. –

+0

Не знаете, почему их методология не применяется. Из нижней части потока видно, что он использовался с Visual C++ 2008. –

+0

'MSVCRT.DLL', который поставляется с Windows, не обладает всей очевидной сложностью, с которой поставляется' MSVCRT90.DLL', и вызывает 'R6034 'ошибка упоминается в вопросе. –

0

Удалить listing.inc удалить ссылки security_check_cookie добавить INCLUDELIB MSVCRT ... et Robert est ton oncle!

Также вы можете добавить: EXTERN _getchar: PROC и перед RET: вызов _getchar Это будет ждать нажатия клавиши, прежде чем программа закрывается.

Honkjonk.

0

Я сделал это недавно. Оказывается, вы все еще можете сделать это в 32-битном режиме в MSVC2012, но я думаю, что 64-битный режим безнадежен.

Для 32-битного режима это то, что вы делаете.

Создать пустой проект и исходный файл Source.cpp

#include <stdio.h> 
int main() { 
    printf("hello world\n"); 
    return 0; 
} 
  1. правой облизывать на проекте и выберите "Build Customization" и
    выберите MASM, как описано здесь http://www.masm32.com/board/index.php?topic=9231.0
  2. Under C++/OutputFiles select Assembly Output/FA
  3. Comipile в 32-разрядном режиме Режим деблокирования
  4. Загрузите файл Source.asm в MSVC, чтобы его можно было просмотреть. Это пока не сработает. Необходимо несколько изменений.
  5. В C++/Оптимизация отключает всю оптимизацию программы (удаляет /GL). Это добавляет линии INCLUDELIB MSVCRT
  6. В Linker/Advanced установлен последний вариант «Изображение имеет Safe Обработчики исключений» в No (/SAFESEH:NO)
  7. Теперь вы должны иметь Source.asm файл, который будет делать то же самое, что источник. Файл cpp сделал. Скопируйте Source.cpp из каталога Release в тот же каталог, что и Source.cpp (чтобы он не удалялся при сборке/очистке).
  8. Добавить Source.asm (как существующий файл) в исходные файлы и удалить Source.cpp из сборки.
  9. Перестроить, и вы должны увидеть «Hello World», не меняя никаких сборочных линий вручную.

Я использовал это для более сложных функций. Обычно я делаю это на отдельном модуле и использую extern "C" в имени функции, чтобы удалить имя языка C++.