Неудовлетворенное форвардное или внешнее объявление с новыми obj-файлами C ++

Я скачал бесплатный компонент Delphi для работы с BZip2-архивами: http://www.torry.net/vcl/compress/other/BZip21.05.zip (Более опытный модуль AbBzip2.pas, компонент Аббревиатура http://sourceforge.net/projects/tpabbrevia/files/) - они очень похожи.

Компоненты работают хорошо.

Проблема:

  1. Вижу, что версия * .obj файлов библиотеки BZip2 в компонентах - старая - 1.0.5 от 10 декабря 2007 года. Решил обновить obj-файлы на новые.

  2. Я иду и скачиваю последнюю версию BZip2 - 1.0.6 - http://www.bzip.org/downloads.html

  3. Распаковать исходный архив BZip2 в папку c: \ BZip2Src

  4. Запустите "Открыть командную строку VS2012 x86 Native Tools" (% comspec% / k "" C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat "" x86)

  5. В консоли я перехожу к c: \ BZip2Src (Cd / d c: \ BZip2Src)

  6. Скомпилируйте проект, как описано в makefile.msc (#usage: nmake.exe -f makefile.msc), и получите новые файлы * .obj. Попутно получил рабочую программу bzip2.exe.

  7. Скопируйте новый * .obj вместо старых блоковort.obj, huffman .., сжать .., распаковать .., bzlib .. в компонент папки для Delphi.

  8. Запустите Delphi, пытаясь перекомпилировать компоненты.

Получите ошибку «[Ошибка dcc32] AbBzip2.pas (215): E2065 Неудовлетворенное прямое или внешнее объявление: 'BZ2_hbMakeCodeLengths'» и другие подобные.

или для bzip2.bas - [Ошибка dcc32] BZip2.pas (171): E2065 Неудовлетворенное прямое или внешнее объявление: '_BZ2_hbMakeCodeLengths'

...
{$L huffman.obj}
{$L compress.obj}
{$L decompress.obj}
{$L bzlib.obj}

{ $L crctable.obj}
{ $L randtable.obj}

{$IFDEF LFS}
uses
  Windows;
{$ENDIF}

procedure _BZ2_hbMakeCodeLengths; external; // **ERROR LINE** 
procedure _BZ2_blockSort; external;  // if i replace on "BZ2_blockSort" (without "_"), i get error "[dcc32 Error] BZip2.pas(710): E2065 Unsatisfied forward or external declaration: 'bz_internal_error'"
procedure _BZ2_hbCreateDecodeTables; external;
...

Я не могу указать все параметры компилятора без каких-либо доработок в командной строке C ++?

Не работал с C ++, помогите правильно скомпилировать * .obj файлы.


person Gu.    schedule 06.08.2013    source источник
comment
Простой ответ заключается в том, что вам следует использовать старые файлы .obj. Попытка заставить это работать с файлами .obj, скомпилированными с cl, а не с bcc32, доставит вам много боли. Даже когда вы разрешите ссылки, у вас наверняка возникнут другие проблемы. Почему вы хотите это сделать?   -  person David Heffernan    schedule 06.08.2013
comment
1. Хочу новую версию с исправлениями. 2. Я хочу научиться делать и прикреплять obj из C ++. 3. Раньше работают (отличий в новой версии zlib2 не так много)   -  person Gu.    schedule 06.08.2013
comment
Я компилирую VS. makefile, nmake.exe или cl.exe. Теперь я попробовал BCC32 - другая ошибка: [ошибка dcc32] BZip2.pas (711): E2065 Неудовлетворенное прямое или внешнее объявление: '__streams' .. '_exit' ... '_fgetc' и т. Д.   -  person Gu.    schedule 06.08.2013
comment
хорошо, у меня старая версия bzip2 (1.0.5) archive.ubuntu.com/ubuntu/pool/main/b/bzip2/, но ошибка не исправляется :(   -  person Gu.    schedule 06.08.2013
comment
Прочтите мой ответ. Последняя версия Abbrevia поставляется с 1.0.6. И вы должны правильно компилировать, как описано в документации для Abbrevia.   -  person David Heffernan    schedule 06.08.2013


Ответы (1)


Файлы Pascal предназначены для использования с файлами .obj, которые компилируются особым образом. Вы не можете скомпилировать с использованием make-файла bzip2. Вам необходимо скомпилировать файлы определенным образом, совместимым с библиотекой Delphi.

Взгляните на Abbrevia. В репозитории sourceforge есть следующее:

bzip2 SDK v1.0.6

Original download available from http://bzip.org/1.0.6/bzip2-1.0.6.tar.gz

Compile 32-bit with
  bcc32 -q -c -u- -w-8004 -w-8008 -w-8057 -w-8066 -w-8068 -DBZ_NO_STDIO *.c

Compile 64-bit with
  cl -c -nologo -GS- -Z7 -wd4068 -Gs32768 -DBZ_NO_STDIO *.c

Таким образом, это говорит о том, что 32-битная Abbrevia предназначена для использования с объектными файлами, скомпилированными с помощью bcc32 (с использованием этой конкретной командной строки). Возможно, вы сможете заставить его работать и с cl. И, конечно же, Крэйгу удалось это сделать для своих 64-битных сборок.

В своем вопросе вы указываете, что файлы bzip2, используемые в Abbrevia, устарели и вы хотите использовать 1.0.6. Что ж, это утверждение не соответствует действительности. У вас явно устаревшая версия Abbrevia.

Вы должны загрузить последнюю версию Abbrevia из репозитория sourceforge, и он поставляется с файлами .obj для bzip2 1.0.6. Именно то, что вы ищете. Если вы хотите внести некоторые изменения в файлы исходного кода bzip2, вы можете сделать это и повторно скомпилировать их, используя указанную выше командную строку.

person David Heffernan    schedule 06.08.2013
comment
Да, работает, спасибо. Еще один небольшой вопрос: какую опцию компилятора можно удалить из отладочного текста obj-файла или любого мусора (если открыть какой-либо объект, я вижу дополнительную ссылку на текстовый путь BSC: \ Program Files (x86) \ Embarcadero \ RAD Studio \ 11.0 \ include \ windows \ sdk \ ime_cmodes. h ...)? для более мелких obj-файлов. - person Gu.; 06.08.2013
comment
Эта информация есть не просто так. Почему вы хотите его удалить? Это не вредит. От его удаления ничего не добьешься. - person David Heffernan; 06.08.2013
comment
То есть нормального obj и оптимизации быть не может? (аналогично delphi = debug dcu) - person Gu.; 06.08.2013
comment
Очевидно, что файл .obj содержит метаданные. В чем проблема? Почему вы хотите удалить его из файла .obj? Вы не собираетесь отправлять файл .obj. Или ты? - person David Heffernan; 06.08.2013
comment
это на размер приложения (ссылка my.exe) повлияет? - person Gu.; 06.08.2013
comment
Все метаданные файла .obj будут удалены на этапе компиляции. Вы можете легко убедиться, что это так, посмотрев метаданные в своем исполняемом файле. - person David Heffernan; 06.08.2013
comment
Еще один бессовестный плагин статьи, объясняющий большую часть того, что здесь обсуждается: Использование объектных файлов C в Delphi, rvelthuis .de / article / article-cobjs.html. - person Rudy Velthuis; 06.08.2013
comment
@RudyVelthuis Эта статья неплохая. Но сейчас это немного устарело. Вот проблемы, которые, как мне кажется, отсутствуют: 1. 64-разрядная версия 2. Упоминание о модуле Crtl 3. Обсуждение COFF и OMF устарело после выпуска XE2, который поддерживает объекты COFF 4. Обсуждение проблем с циклическими ссылками и того, как для их разрешения (ошибка stackoverflow.com/questions/4638186/). - person David Heffernan; 06.08.2013
comment
@DavidHeffernan: Действительно, это немного устаревший WRT Win64 и другие платформы. Я уже планировал добавить раздел про Win64 и OSX (и, возможно, iOS тоже), как только у меня будет немного больше времени для этого. И (довольно новый) модуль Crtl тоже нуждается в упоминании. Я также рассмотрю проблему круговой ссылки. Спасибо за подсказки. - person Rudy Velthuis; 07.08.2013
comment
@Rudy Если вы все, что делаете, круговая ссылка, укажите на мой связанный ответ, который был бы полезен. Я делал много этого и очень часто сталкивался с проблемами циклической ссылки. Придуманный мною трюк - огромное благо! - person David Heffernan; 07.08.2013
comment
@ Дэвид: Только что сделал это, спасибо. Если вы видите какие-либо ошибки (или другие ошибки), напишите мне (вы можете найти мой адрес электронной почты на форумах Embarcadero). - person Rudy Velthuis; 07.08.2013
comment
@RudyVelthuis Мне не удалось найти ваш адрес электронной почты. Пара комментариев: 1. Вероятно, лучший способ получить cl - это Platform SDK. 2. cl (по крайней мере, на x64, но я думаю, что точка) использует другое оформление (определенно для cdecl функций) без начального подчеркивания. 3. С cl вам понадобится /GS-, чтобы избежать неразрешенной ссылки на помощник компилятора. названная функция, IIRC, chkstk. - person David Heffernan; 07.08.2013
comment
@ Дэвид: спасибо за информацию. Я изучу это и обновлю статью. - person Rudy Velthuis; 07.08.2013