Как создаются библиотечные классы - PullRequest
1 голос
/ 21 января 2012

Я собираюсь спросить, как это делается в c ++, но эта идея может применяться к нескольким языкам.Если вы знаете, как сделать это и в target-c, укажите, пожалуйста, какие-либо сходства между этими двумя

Допустим, я хочу создать экземпляр ofstream, подобный

ofstream myfile;

.Я предполагаю, что все, что у меня есть на моем компьютере, это файл * .o (в архиве библиотеки) и файл * .h для класса iostream.Если эта часть не соответствует действительности, дайте мне знать.Я предполагаю это, когда все, что я установил, это среда выполнения и пакеты devel, а не исходные файлы.

Как он соединяет заголовочный файл с объектным файлом, существует ли схема именования.И где это выглядит и в каком порядке .?

Почему это меня смущает, обычно, когда я хочу создать класс, я связываю свою реализацию класса с программой, поэтому где это происходит сейчас и кактеперь, чтобы связать файлы?

Еще один, имеет ли значение, если он загружался статически или динамически?

Заранее спасибо, и sry, если это глупый вопрос.

Ответы [ 3 ]

2 голосов
/ 21 января 2012

Это не стандартизировано и зависит от реализации. Я не знаю о * unix, но я предполагаю, что он довольно похож на Windows.

Можно предположить, что .o файлы аналогичны файлам библиотеки .lib.

Заголовок определяет определение класса, так что компоновщик знает, что искать в библиотеке.

Скажем, у вас есть заголовок:

class A
{
public:
    A();
    void foo();
};

и файл lib A.lib.

Вы включаете этот заголовок и звоните:

A a;
a.foo();

Компилятор находит объявления для ботов A() и A::foo(). Теперь он знает, что должен искать в библиотеке эти функции. Имена в библиотеке оформлены и содержат модификаторы, но они специфичны для компилятора, поэтому компоновщик находит функции, если они экспортируются в библиотеку. Затем он связывает функции с конкретной точкой входа из DLL.

Если под динамической загрузкой вы подразумеваете использование LoadModule() и GetProcAddress() вместо компоновки, тогда концепция довольно схожа.

2 голосов
/ 21 января 2012

Информатика 101:

  1. В широком смысле (ОЧЕНЬ широко!) Существует два вида "программ":

    a) Интерпретированный: вы читаете исходный текст программы каждый раз, когда выполняете его <= * Сценарии оболочки nix и файлы .bat DOS «пересекаются» </p>

    b) Скомпилировано: вы читаете источник один раз (чтобы преобразовать его в «двоичный машинный код»). Вы связываете машинный код «объектные файлы» для создания «исполняемой программы».

  2. Вы говорите о "скомпилированных программах"

  3. Часть ofstream не имеет значения, если программа «скомпилирована»

    Двоичная реализация "ofstream" может быть скомпилирована непосредственно в исполняемый файл или может быть динамически загружена из общей библиотеки (.dll) во время выполнения.

  4. "Компилятор" использует заголовки ".h" для обработки исходного файла.

    "компоновщик" использует библиотеки ".lib" для сопоставления символов и связывания статического кода в типе ссылки.

    «Операционная система» распознает динамические ссылки и загружает необходимые общие библиотеки (.dll) во время выполнения.

Три разные вещи, все независимые друг от друга: компилятор / исходный код, код компоновщика / машинного объекта, ОС / исполняемые программы

Надеюсь, это поможет ... немного ...

0 голосов
/ 21 января 2012

Если вы делаете статическое связывание, все символы со связью доступны в файле .obj. Линкер связывает вызовы функций с точками входа функций. В этом процессе задействовано управление именами, чтобы символы могли быть правильно разрешены.

Динамическое связывание является проблемой, зависящей от платформы, и, насколько я знаю, не является частью стандарта C или C ++.

...