Прилинковать OBJ в MS C++

Тема в разделе "WASM.BEGINNERS", создана пользователем cryptoexp, 14 июл 2020.

  1. cryptoexp

    cryptoexp New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2017
    Сообщения:
    19
    Драсте, помогите чайнику использовать в своем проекте OBJ-файл скомпиленый например в fasm. Для теста делаю так:
    Взял стандартный пример из пакета fasm
    Код (Text):
    1. format MS COFF
    2.  
    3. extrn '__imp__MessageBoxA@16' as MessageBox:dword
    4.  
    5. section '.text' code readable executable
    6.  
    7.  public _demo
    8.  
    9.  _demo:
    10.    push   0
    11.    push   _caption
    12.    push   _message
    13.    push   0
    14.    call   [MessageBox]
    15.    ret
    16.  
    17. section '.data' data readable writeable
    18.  
    19.  _caption db 'Win32 assembly',0
    20.  _message db 'Coffee time!',0
    MSCOFF.OBJ в своем проекте добавил файл, и добавил пармаетры линкера /DEF:"MSCOFF.OBJ" /ASSEMBLYMODULE:"MSCOFF.OBJ"
    пересобираю, смотрю в выходном ехе появилас в импорте MessageBox.

    добавляю вызов в C++
    Код (Text):
    1. #include <iostream>
    2.  
    3. extern void _demo();
    4.  
    5. int main()
    6. {
    7.     std::cout << "Hello World!\n";
    8.     _demo();
    9. }
    10.  
    не собирается..

    1>------ Перестроение всех файлов начато: проект: ConsoleApplication, Конфигурация: Debug Win32 ------
    1>ConsoleApplication.cpp
    1>MSCOFF.OBJ : warning LNK4017: оператор L не поддерживается на конечной платформе; пропущен
    1> Создается библиотека C:\DEVELOPMENT\ConsoleApplication\Debug\ConsoleApplication.lib и объект C:\DEVELOPMENT\ConsoleApplication\Debug\ConsoleApplication.exp
    1>ConsoleApplication.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl _demo(void)" (?_demo@@YAXXZ) в функции _main
    1>C:\DEVELOPMENT\ConsoleApplication\Debug\ConsoleApplication.exe : fatal error LNK1120: неразрешенных внешних элементов: 1
    1>Сборка проекта "ConsoleApplication.vcxproj" завершена с ошибкой.
    ========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========

    Что именно ему не нравится?
     
  2. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    name mangling функции _demo . Его не должно быть
     
  3. cryptoexp

    cryptoexp New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2017
    Сообщения:
    19
    Потому что в рабочей версии нужно линковать много скомпиленых на fasm OBJ-файлов. ассемблерные вставки не годятся. да и в x64 их нет.

    это не понятно, чего не должно быть?

    заменил _demo на MyDemo - не помогло!
    да это сстрочку вообще убрать можно, она не причем!
     
    Последнее редактирование: 14 июл 2020
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    extern "C" void _demo();
     
  5. cryptoexp

    cryptoexp New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2017
    Сообщения:
    19
    Ошибка LNK2019 ссылка на неразрешенный внешний символ __demo в функции _main ConsoleApplication C:\DEVELOPMENT\ConsoleApplication2\ConsoleApplication\ConsoleApplication.obj 1
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    О, хоспаде. extern "C" void demo()
    --- Сообщение объединено, 15 июл 2020 ---
    Неужели нельзя прочитать сообщение линкера и понять, что он ищет __demo, а у тебя символ _demo?
     
    cryptoexp нравится это.
  7. cryptoexp

    cryptoexp New Member

    Публикаций:
    0
    Регистрация:
    6 сен 2017
    Сообщения:
    19
    да, пробовал конечно же, но видиом не так как нужно...
    все оказалось просто, спс!