Есть реализация алгоритмов сжатия на NASM http://vx.org.ua/herm1t/compr.zip, пытаюсь собрать и использовать в своём C++ проекте. Делаю так: компилю .obj "nasmw -f win32 rle.asm", дальше в С++: Код (Text): extern int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long); Линкер стал ругаться Код (Text): TestCompress.obj : error LNK2019: unresolved external symbol "int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long)" (?rle_compress@@YAHPAE0K@Z) referenced in function _main Чтобы было соответствие по параметрам изменил имя функции в rle.asm на ?rle_compress@@YAHPAE0K@Z, снова попытался собрать: Код (Text): TestCompress.obj : error LNK2019: unresolved external symbol "int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long)" (?rle_compress@@YAHPAE0K@Z) referenced in function _main rle.obj : error LNK2001: unresolved external symbol "int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long)" (?rle_compress@@YAHPAE0K@Z) rle.obj : error LNK2001: unresolved external symbol "?rle_compress@@YAHPAE0K@Z.rstc" (?rle_compress@@YAHPAE0K@Z.rstc) ... Как всё таки собрать это дело? Спасибо.
В смысле, Код (Text): extern "C" int __cdecl rle_compress(unsigned char *,unsigned char *,unsigned long); ?? Тоже самое..
..\..\compr\nasm-0.98.39\rle.obj : fatal error LNK1107: invalid or corrupt file: cannot read at 0x121 Уже по-всякому пробовал - не получается.. Если есть возможность - проверь, пожалуйста, у себя.. nasm можно скачать тут: http://www.wasm.ru/baixado.php?mode=tool&id=50 Спасибо.
Во-первых, без явного указания принадлежности процедуры секции кода, NASM сгенерит такой coff файл, что в нем в symbol table все метки(даже определенные в данном asm файле) будут помечены, как неинициализированные/внешние, тоесть для них не будет указана секция в объектнике. Ессно, линкер при связывании будет искать их "снаружи". Во-вторых, NASM генерит имя метки в полном соответствии с именем заданным пользователем, т.е. без префиксного "_", что однако добавляет транслятор Си. Теперь как лечить. Первое, для построения правильного объектника из .asm файла явно указываем секцию для инициализированных меток Код (Text): section .text global rle_compress, rle_expand rle_compress: pusha Второе, домангливаем asm-имена до вида генерируемого extern "C" Код (Text): section .text global _rle_compress, _rle_expand _rle_compress: pusha Ну и третье, в .cpp файле юзаем для всех ф-ий из этих .asm файлов префикс extern "C"