Могут ли статические библиотеки, не основанные на стандартной библиотеке C, быть скомпилированы в одной ОС, а затем перенесены в другую? - PullRequest
0 голосов
/ 25 марта 2019

Я знаю, что для полных программ это невозможно из-за форматов исполняемых файлов и системных вызовов, однако, если у вас был файл с:


    int add(int a, int b) {
        return a + b;
    }

Не могли бы вы скомпилировать его как объектный файл или статическую библиотеку в Linux, а затем использовать его на MacOS или Windows?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Компиляция кода C превращает его в собственный двоичный / собственный образ. Это зависит от процессора / ОС, на которой он скомпилирован (если, конечно, вы не используете кросс-компилятор). Двоичный файл / объект не будет работать в другой ОС.

Только в случае таких языков, как java, C#, возможно, что вы можете скомпилировать для одной ОС и запустить на другой (без перекомпоновки). Это потому, что эти языки создают управляемый двоичный файл / объект. Этот управляемый объект не запускается непосредственно в ОС. Он работает на виртуальной машине (JVM для Java и CLR для C#).

0 голосов
/ 26 марта 2019

Можно ли скомпилировать статические библиотеки, не основанные на стандартной библиотеке C, в одной ОС, а затем переместить в другую?

Теоретически;да.Обратите внимание, что компилятор - это всего лишь то, что преобразует основной язык (например, C) во вторичный язык (например, может быть нативный код для конкретной ОС и конкретного ЦП), но может быть также исходный код BASIC или исходный код веб-сборки или какой-то переносимыйбайт-код или что-либо еще).

Единственное, что действительно имеет значение, это то, что любой, кто использует вторичный язык, понимает вторичный язык.

На практике;для статических библиотек вспомогательный язык включает в себя такие вещи, как форматы объектных файлов и соглашения о вызовах;и «все, что использует вторичный язык, понимает вторичный язык» включает в себя понимание формата объектного файла, понимание соглашений о вызовах и т. д. Обычно компиляторы настроены так, что их вторичный язык соответствует тому, что имеет смысл для компьютера, на котором работает компилятор, и потому чтоиз этого часто вы не можете скомпилировать статическую библиотеку на одном компьютере и перенести ее на другой компьютер (с другим компилятором и / или ОС и / или процессором).

Однако «типичный» не означаетнеобходимость.Кросс-компиляторы вполне возможны.

Например, вы можете портировать GCC (и его инструменты - компоновщик и т. Д.) На Windows и использовать свой кросс-компилятор для создания статических библиотек, которые могут использоваться компилятором, предназначенным для(и работает на) Linux;и если вы сделаете это, вы, вероятно, не сможете использовать кросс-компилятор (работающий в Windows) для создания статических библиотек для других компиляторов, также работающих в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...