Могут ли 64-битные цели Delphi статически связываться с скомпилированными объектными файлами C?

Мое 32-битное приложение Delphi 2010 связывается с несколькими объектными файлами C с помощью директивы компилятора $LINK. Могу ли я сделать это в Delphi XE2, ориентируясь на 64-разрядную версию?

В настоящее время я компилирую с помощью bcc32 версии 5.5, но мне все равно, какой компилятор использовать, если окажется, что компилятор Embarcadero C еще не выводит 64-битные объекты.


person David Heffernan    schedule 01.09.2011    source источник
comment
Я где-то читал, что вы можете связать объектные файлы COFF (созданные с помощью MS VC++ как файлы .obj) в 64-битном приложении Delphi.   -  person Warren P    schedule 01.09.2011
comment
@Rudy Это уже отправлено. ELF не годится для Windows.   -  person David Heffernan    schedule 01.09.2011
comment
Конечно, вы могли бы использовать другой компилятор, который может генерировать 64-битный COFF или что вам нужно, возможно, один из компиляторов GNU или LLVM? Я полагаю, компилятор BCC v. 5.5 бесплатный? Он уже немного староват и не очень стандартен.   -  person Rudy Velthuis    schedule 01.09.2011
comment
@Rudy Да, бесплатный. Да, она старая, но мне вполне хватает. Код C, который я компилирую, еще старше, в основном он был создан из моей любимой программы f2c -a.   -  person David Heffernan    schedule 01.09.2011
comment
Вот ссылка на бесплатную пробную версию.   -  person LU RD    schedule 01.09.2011
comment
@LU Я собираюсь купить товар, но хотел бы знать ответ.   -  person David Heffernan    schedule 01.09.2011
comment
@LU RD: я отменил свой ответ. Как член TeamB, я знаю хорошие места, где можно узнать больше о Delphi, но в последнее время я был немного занят и пропустил фактическую отгрузку XE2. <г>   -  person Rudy Velthuis    schedule 02.09.2011
comment
Теперь вы не используете термин статическая компоновка правильно :-P Кстати, объектный файл всегда компилируется, так что это тоже оксюморон.   -  person Premature Optimization    schedule 08.09.2011
comment
@downvoter что такое $LINK, если не статическая ссылка?   -  person David Heffernan    schedule 08.09.2011


Ответы (2)


да. Вы должны скомпилировать файлы объектов "C" в формат COFF. Обычно это означает компиляторы Intel и/или MSVC++. К 64-битным объектным файлам применяются те же предостережения, что и к 32-битным. Вы должны убедиться, что все внешние ссылки правильно разрешены, либо предоставив другой .obj с этим символом, либо из кода Delphi. При построении кода "C" убедитесь, что вы отключили любые проверки стека или другую генерацию кода проверки во время выполнения. Во многих случаях такой codegen опирается на определенную версию RTL C/C++ из данного инструмента.

Еще стоит отметить, что в то время как 64-разрядная версия Delphi может связываться с объектными файлами COFF (в конечном итоге она также будет поддерживать ELF64), 32-разрядная версия Delphi поддерживает связывание с объектными файлами OMF, созданными C++Builder и, что является новым для XE2, 32-битные объектные файлы COFF, которые можно создать с помощью MSVC++. Применяются те же оговорки.

person Allen Bauer    schedule 01.09.2011
comment
Большое спасибо за ответ, Алена, это именно то, что я хотел услышать. Я думаю, что наконец-то я собираюсь вернуться в ЮАР. Еще один вопрос: знаете ли вы, создает ли gcc/mingw объекты, которые могут быть использованы Delphi? - person David Heffernan; 01.09.2011
comment
Также стоит упомянуть, что модуль System.Win.Crtl.pas обеспечивает поддержку компоновки во многих основных процедурах среды выполнения C, которые необходимы при компоновке в файлах .obj. Этот модуль является частью пакета RTL. Смотрите комментарии/отказ от ответственности/предупреждения в исходном файле, прежде чем использовать его. :) - person Mark Edington; 15.09.2011
comment
О форматах OBJ (например, если вы спросите, почему одно и то же расширение файла может иметь несколько форматов), см. agner.org/optimize сайт. Он часто обновляется, содержит много интересного материала, особенно про 64 битность и кроссплатформенность. Есть даже конвертер между форматами COFF/OMF и кроссплатформенный декомпилятор. - person Arnaud Bouchez; 03.10.2011

Да, вы можете ссылаться на файлы OBJ в 64-битных проектах XE2, но файлы OBJ должны иметь 64-битный код.

person Mason Wheeler    schedule 01.09.2011
comment
Знаете ли вы, какого формата должны быть объекты и какие компиляторы могут их создавать? - person David Heffernan; 01.09.2011