Почему порядок связанного объектного файла с директивой $ L имеет значение? - PullRequest
4 голосов
/ 12 июля 2010

Я использую статически связанную базу данных sqlite, и для компиляции каждой следующей версии мне иногда приходится вносить небольшие изменения в список используемых объектных файлов.Но иногда изменения, которые я должен внести, меня озадачивают.Например, до версии 3_6_10 этот порядок

{$L 'Objs\is.OBJ'}
{$L 'Objs\mbisspc.OBJ'}

был в порядке, но начиная с 3_6_12 компоновщик сказал:

unsatisfied forward or external declaration _isspace

, но поменял порядок на

{$L 'Objs\mbisspc.OBJ'}
{$L 'Objs\is.OBJ'}

,Что касается изменений в sqlite, то он действительно перестал использовать функцию c isspace в 3_6_12 и начал использовать внутренний эквивалент, поэтому ключевое слово isspace даже не появляется внутри файла obj.

Так почему порядок связанного объектного файла с директивой $ L имеет значение и где я могу прочитать об этом больше?Я полагаю, что это связано с перекрестным использованием перечисленных файлов obj, но я буду чувствовать себя в большей безопасности, если пойму, что происходит

Спасибо

1 Ответ

4 голосов
/ 12 июля 2010

Изменить:

Что касается комментария Дэвида Хеффернана , ссылающегося на его ответ на этот другой вопрос о связи файла .obj в Delphi , я заменил linker compiler и добавили курсив ниже:

Компиляторы C используют многопроходный компилятор linker , который знает, как разрешать прямые и циклические зависимости между файлами .obj.

Поскольку компилятор Delphi linker нацелен на язык Delphi, а язык Delphi этого не допускает, компилятор linker также не допускает этого.

Pro: компилятор работает намного быстрее.

Con: вам нужно немного помочь компилятору linker , разместив файлы .obj в правильном порядке
или путем ручного разрешения зависимостей (см. Вышеупомянутый ответ Дэвида Хеффернана ) .

- Йерун

...