2016-08-02 2 views
1

Я пытаюсь совместить сборку (скомпилированную с yasm) с объектами, собранных msvc/cl.exe, который я пытаюсь связать (с link.exe) в .dll, который затем связан с окончательным исполняемым файлом.Нерешенная Ссылка при связывании скомпилированного кода с NASM и MSVC

Как создание объектных файлов из источника, так и создание dll с этих объектов работает абсолютно нормально.

На последнем этапе, связывая .dll с исполняемым выплевывает следующие ошибки:

error LNK2019: unresolved external symbol xxx_xxxx 

Я использую C. Несмотря на Win64, не имеющие названия коверкая, я попробовал несколько схем (например, _xxx_xxxx или __imp_xxx_xxxx) ,

Рассматривая объектный файл с dumpbin.exe показывает все символы:

$ dumpbin /symbols myobj.o 
File Type: COFF OBJECT 

COFF SYMBOL TABLE 
000 00000000 DEBUG notype  Filename  | .file 

002 00000000 SECT1 notype  Static  | .text 
Section length 215, #relocs 0, #linenums 0, checksum  0 
004 00000057 SECT1 notype  External  | xxx_xxxx 
005 0000013E SECT1 notype  External  | xxx_xxxx 
006 00000000 SECT1 notype  External  | xxx_xxxx 

Но не в экспортируемых символах из .dll:

$ dumpbin /exported mylib.dll 
File Type: DLL 

    Section contains the following exports for mylib.dll 

    00000000 characteristics 
    57A0FE02 time date stamp Tue Aug 02 22:09:38 2016 
     0.00 version 
      1 ordinal base 
     132 number of functions 
     132 number of names 

[...] 

Хотя я маркированное заявление, как экспортируется внутри .dll используя __declspec(dllexport).

Любые идеи, как удовлетворить компоновщик и сказать ему, что символы действительно есть?

+0

Вы не можете связать DLL с исполняемым файлом с помощью инструментов Microsoft. Вам нужно использовать библиотеку импорта, соответствующую DLL. –

+0

@RossRidge Я использую созданную библиотеку импорта. – Leandros

ответ

1

Как вы видите, проблема в том, что DLL не отображает требуемый символ. __declspec(dllexport) - не единственный способ экспортировать ваши символы. Если у вас несколько экспортированных имен, вы можете использовать переключатель ссылок /EXPORT. Другой альтернативой является использование файла Module-Definition.

+0

К сожалению, это не просто несколько функций, что делает '/ EXPORT' невыполнимым. Можно ли комбинировать уже созданную .lib, чтобы связать DLL с другим созданием через файл def? – Leandros

+0

Да, файл DEF - это список функций, которые вы хотите экспортировать (плюс дополнительная информация). Это не влияет на функциональность результирующих двоичных файлов. И, конечно, вы должны проверить, что функции отображаются в таблице экспорта с помощью 'dumpbin'. – Sergio

+0

Хотя это работает, это, к сожалению, только половина решения. Я не могу добавить каждый символ вручную к моим флагам сборки или файлу def. – Leandros

Смежные вопросы