Простые вопросы библиотеки (C ++) - PullRequest
3 голосов
/ 08 декабря 2011

1. Являются ли разделяемые библиотеки и динамические библиотеки одинаковыми?
Windows просто помечает их как .dll, а linux помечает их как .so?

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

3. Если я сделаю библиотеку, как это:

#ifndef SHARED_H
#define SHARED_H

#include <iostream>
#include <string>

namespace shared
{
  void Function1(void);
  void Function2(void);
  void Function3(void);
  void Function4(void);
  void Function5(void);
  void Function6(void);
  ...
  void Function99(void);
  void Function100(void);
  ...
}
//assume none of these functions call each other

#endif

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

4. Отличается ли сценарий вопроса 3, если я использую класс:

#ifndef SHARED_H
#define SHARED_H

#include <iostream>
#include <string>

class Shared
{
  public:
  void Function1(void);
  void Function2(void);
  void Function3(void);
  void Function4(void);
  void Function5(void);
  void Function6(void);
  ...
  void Function99(void);
  void Function100(void);
  ...
  private:
  protected:
};
//assume none of these functions call each other

#endif

5. Я использую для создания много объектов (файлов .o), а затем связываю их вместе, чтобы сделать мой исполняемый файл. было бы лучше превратить все мои объекты (которые обычно являются классами) в файл .so И ТОГДА связать их вместе?
Я понимаю, что исполняемый файл будет опираться на файл .so, в отличие от первого подхода, когда объекты могут быть просто удалены после компиляции, но какова рекомендация по этому поводу?

6. Я немного не в курсе разницы между -fPIC и -fpic
Я слышал, что -fPIC всегда будет работать, а -fpic зависит от цели.
Что означает целевой зависимый? Если библиотека всегда будет компилироваться и использоваться на одном компьютере, могу ли я использовать -fpic?

некоторые из этих вопросов могут быть тривиальными, но я хочу быть уверенным о вещах, которые я прочитал до сих пор. Я ценю любой и все ответы
* При необходимости: использование gcc версии 4.6.1 (Ubuntu / Linaro 4.6.1-9ubuntu3)

Ответы [ 2 ]

6 голосов
/ 08 декабря 2011

Для 1-го и 2-го вопроса: В Windows Xp потоки имеют dll (библиотеки динамической компоновки) как компонент. Как поток может рассматриваться как легкий процесс. Процесс - это не что иное, как программа в Execution. (Время выполнения). Я полагаю, что dll и .so похожи (возможно, существует вариация, не уверен)

Внешние библиотеки обычно предоставляются в двух формах: статические библиотеки и общие библиотеки. Статические библиотеки - это файлы .a. когда программа связана со статической библиотекой, машинный код из объектные файлы для любых внешних функций, используемых программой, копируются из библиотека в окончательный исполняемый файл.

Исполняемый файл, связанный с общей библиотекой, содержит только небольшой таблица необходимых функций вместо полного машинного кода из объектных файлов для внешних функций. Перед исполняемым файлом запускается, машинный код для внешних функций копируется в память из файла общей библиотеки на диске операционной системы - Процесс, называемый динамическим связыванием. Динамическое связывание уменьшает размер исполняемых файлов и экономит место на диске, поскольку одна копия библиотеки может использоваться несколькими программами.

Для 3-го вопроса: , так как в разделяемой библиотеке загружается только таблица функций, а не действительная мнемоника кода, поэтому мы сохраняем данные в отличие от статической библиотеки, в которой мнемоника загружается во время компиляции. вышеприведенное объяснение.

Для 5-го вопроса: Я думаю, что будет лучше сделать их как «.so», только если вы знаете, что вы редко используете эти функции. Если вы будете часто использовать эти функции, то сделать те функции, которые содержат lib, статическими. Выбор их во время выполнения увеличивает время отклика.

2 голосов
/ 08 декабря 2011
  1. В Win dll's - это динамически связанные библиотеки, то есть они загружаются отдельно в память во время выполнения, в отличие от статически связанных библиотек (lib's), которые встроены в ваш модуль во время компиляции.

  2. В Win до запуска программы. Если он не может найти dll, в котором он нуждается, он сообщит об ошибке и завершит работу. Это если вы не пытаетесь динамически вызывать функции, а не связываться с библиотекой через LoadLibrary и GetProcAddress.

  3. Нет. Функции занимают известное место в памяти при загрузке библиотеки. Для каждого вызова функции существует только одна jmp или call инструкция, независимо от того, сколько существует функций.

  4. Также нет. Скорее всего, эти функции будут представлены как функции, не являющиеся членами, которые принимают this в качестве дополнительного параметра.

  5. Основной причиной будет повторное использование. Если у вас есть функционально независимый модуль, который содержит несколько объектных файлов, вы можете сгруппировать их вместе. Таким образом, вы можете использовать его более легко, потому что вы будете ссылаться только на одну библиотеку вместо нескольких объектных файлов.

  6. ???

...