Цель этой публикации —Цельдать всем возможность научиться создавать и использовать статические и динамические библиотеки, понимать различия между статическими и динамическими библиотеками и знать, как выбирать при их использовании. Мы не будем глубоко рассматривать внутренние форматы и структуры памяти статических и динамических библиотек. Тем, кому интересно, рекомендуем книгу: «Самосовершенствование программиста — компоновка, загрузка и библиотеки».

1. Что такое библиотека

Библиотека — это написанный, существующий, зрелый код, который можно повторно использовать.В действительности каждая программа зависит от множества базовых низкоуровневых библиотек. Невозможно, чтобы каждый писал код с нуля. Поэтому существование библиотек имеет исключительное значение.。

По сути, библиотека — это двоичная форма исполняемого кода, которая может быть загружена операционной системой в память и выполнена. Существует два типа библиотек: статические библиотеки (.a, .lib) и динамические библиотеки (.so, .dll).

Так называемые статические и динамические относятся к компоновке. Давайте вспомним шаги компиляции программы в исполняемый файл:

clip_image002[4]

Рисунок: процесс компиляции

2. Статические библиотеки

Она называется «статической библиотекой», потому что на этапе компоновки объектные файлы .o, созданные на этапе ассемблирования, компонуются и упаковываются вместе с используемыми библиотеками в исполняемый файл. Поэтому соответствующий метод компоновки называется статической компоновкой.

Подумайте: статическая библиотека компонуется вместе с объектными файлами, созданными на этапе ассемблирования, в исполняемый файл, поэтому статическая библиотека должна быть схожа по формату с файлами .o. Фактически статическую библиотеку можно просто рассматривать какгруппу объектных файлов (.o/.objнабор файлов)То есть файл, образованный сжатием и упаковкой множества объектных файлов. Краткая характеристика статических библиотек:

- Связывание статической библиотеки с библиотеками функций завершается на этапе компиляции.

- Во время выполнения программа никак не связана с библиотекой функций, что упрощает перенос.

- Расходует пространство и ресурсы, поскольку все связанные объектные файлы и задействованные библиотеки функций компонуются вместе в один исполняемый файл.

Ниже мы напишем несколько простых классов C++ для базовых арифметических операций и скомпилируем их в статическую библиотеку, чтобы другие могли её использовать. Заголовочный файл выглядит следующим образом:

Заголовочный файл StaticMath.h
#pragma once
class StaticMath
{
public:
    StaticMath(void);
    ~StaticMath(void);
 
    static double add(double a, double b);//加法
    static double sub(double a, double b);//减法
    static double mul(double a, double b);//乘法
    static double div(double a, double b);//除法

    void print();
};

В Linux используйтеarинструмент, а в Windows с помощью VSlib.exeобъедините объектные файлы, пронумеруйте их и создайте индекс для удобного поиска и извлечения. Общие шаги создания статической библиотеки показаны на рисунке:

clip_image004[4]

Рисунок: Процесс создания статической библиотеки

2.1. Создание и использование статических библиотек в Linux

2.1.1. Правила именования статических библиотек в Linux

Соглашение об именовании статических библиотек в Linux должно быть "lib[your_library_name].a": lib — это префикс, в середине — имя статической библиотеки, а расширение — .a.

2.1.2. Создание статической библиотеки (.a)

Из описанного выше процесса можно понять, что процесс создания статической библиотеки в Linux выглядит так:

- Сначала скомпилируйте файл кода в объектный файл .o (StaticMath.o)

g++ -c StaticMath.cpp

Примечание: используйте параметр -c; иначе он будет скомпилирован непосредственно в исполняемый файл.

- Затем с помощью инструмента ar упакуйте объектный файл в файл статической библиотеки .a

ar -crv libstaticmath.a StaticMath.o

Сгенерируйте статическую библиотекуlibstaticmath.a。

clip_image006[4]

Для более крупных проектов пишутся makefile-файлы (и инструменты управления проектами, такие как CMake) для создания статических библиотек; вводить несколько команд слишком утомительно.

2.1.3. Использование статических библиотек

Напишите тестовый код, который использует созданную выше статическую библиотеку:

Тестовый код:
#include "StaticMath.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    double a = 10;
    double b = 2;

    cout << "a + b = " << StaticMath::add(a, b) << endl;
    cout << "a - b = " << StaticMath::sub(a, b) << endl;
    cout << "a * b = " << StaticMath::mul(a, b) << endl;
    cout << "a / b = " << StaticMath::div(a, b) << endl;

    StaticMath sm;
    sm.print();

    system("pause");
    return 0;
}

Чтобы использовать статическую библиотеку в Linux, достаточно указать путь поиска статической библиотеки (параметр -L) и указать имя статической библиотеки (без префикса lib и без суффикса .a, параметр -l) во время компиляции.

# g++ TestStaticLibrary.cpp -L../StaticLibrary -lstaticmath

clip_image008[4]

- -L: Указывает каталог, в котором находится библиотека для компоновки

- -l: Указывает динамическую библиотеку, необходимую для компоновки. При поиске динамических библиотек компилятор использует неявное правило именования: он добавляет lib перед заданным именем и .a или .so после него, чтобы определить имя библиотеки.

2.2. Создание и использование статических библиотек в Windows

2.2.1. Создание статической библиотеки (.lib)

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

- Сначала с помощью параметра компилятора/cдляCl.exeскомпилируйте код (cl /c StaticMath.cpp), создав объектный файл с именем "StaticMath.obj".

- Затем используйте менеджер библиотекLib.exe, чтобы скомпоновать код (lib StaticMath.obj), создав статическую библиотеку StaticMath.lib.

Конечно, обычно мы так не делаем; удобнее использовать настройки проекта VS. При создании консольного приложения Win32 отметьте тип статической библиотеки; откройте "Страницы свойств" -> "Свойства конфигурации" -> "Общие" проекта и выберите "Статическая библиотека" в качестве типа конфигурации.

clip_image010[4]

Рисунок: настройки свойств проекта статической библиотеки в VS

Соберите проект, чтобы создать статическую библиотеку.

2.2.2. Использование статических библиотек

Тестовый код такой же, как в Linux. Есть 3 способа его использования:

Способ 1:

Как использовать статическую библиотеку в VS:

- В проекте "Страницы свойств" -> "Общие свойства" -> "Платформа и ссылки" -> "Добавить ссылку" появится диалоговое окно "Добавить ссылку". На вкладке "Проект" перечислены проекты в текущем решении и все библиотеки, на которые можно ссылаться. На вкладке "Проект" выберите StaticLibrary. Нажмите "ОК".

clip_image012[4]

- Добавьте каталог заголовочного файла StaticMath.h; необходимо изменить путь к каталогу включаемых файлов. Откройте проект "Страницы свойств" -> "Свойства конфигурации" -> "C/C++" -> "Общие" и в значении свойства "Дополнительные каталоги включаемых файлов" введите путь к каталогу, содержащему заголовочный файл StaticMath.h, или выберите этот каталог.

clip_image014[4]

Компиляция и запуск выполнены успешно.

clip_image015[4]

Рисунок: результат теста статической библиотеки (VS)

Если подключаемая статическая библиотека не является подпроектом в том же решении, а используются сторонняя статическая библиотека lib и заголовочный файл, описанный выше способ применить нельзя. Есть ещё 2 других способа, которые также применимы.

Метод 2:

Откройте проект "Страницы свойств" -> "Свойства конфигурации" -> "Компоновщик" -> "Командная строка" и введите полный путь к статической библиотеке.

clip_image017[4]

Метод 3:

- "Страницы свойств" -> "Свойства конфигурации" -> "Компоновщик" -> "Общие", введите каталог, в котором находится статическая библиотека, в поле "Дополнительные каталоги библиотек";

- "Страницы свойств" -> "Свойства конфигурации" -> "Компоновщик" -> "Ввод", введите имя статической библиотеки StaticLibrary.lib в поле "Дополнительные зависимости".

clip_image019[4]

3. Динамические библиотеки

Из приведённого выше введения видно, что статические библиотеки просты в использовании и понимании, а также позволяют достичь цели повторного использования кода. Так почему же нам всё ещё нужны динамические библиотеки?

3.1. Зачем всё ещё нужны динамические библиотеки?

Потребность в динамических библиотеках на самом деле вызвана особенностями статических библиотек.

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

clip_image021[4]

- Ещё одна проблема заключается в том, что статические библиотеки создают трудности при обновлении, развёртывании и выпуске программ. Если статическая библиотека liba.lib обновляется, все использующие её приложения нужно перекомпилировать и выпустить для пользователей (для пользователей это может быть очень небольшим изменением, но оно приводит к необходимости повторно загружать всю программу,полное обновление)。

Динамические библиотеки не компонуются в объектный код во время компиляции, а загружаются только при выполнении программы.Если разные приложения вызывают одну и ту же библиотеку, то в памяти нужен только один экземпляр этой разделяемой библиотеки., избегая проблемы нерационального использования пространства. Динамические библиотеки загружаются только при выполнении программы, что также решает трудности, которые статические библиотеки создают при обновлении, развёртывании и выпуске программ. Пользователям нужно обновить только динамическую библиотеку,инкрементальное обновление.。

clip_image023[4]

Сводка характеристик динамических библиотек:

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

- Она позволяет реализовать совместное использование ресурсов между процессами. (Поэтому динамические библиотеки также называют разделяемыми библиотеками.)

- Она упрощает обновление некоторых программ.

- Она может даже действительно обеспечить, чтобы компоновка и загрузка полностью контролировались программистом в программном коде (явный вызов)。

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

В системе Windows формат исполняемого файла — это формат PE, и динамическая библиотека требует, чтобы функцияDllMain служила точкой входа для инициализации. Обычно при объявлении экспортируемых функций нужно _declspec(dllexport).keyword。

- В Linux исполняемые файлы, скомпилированные gcc, по умолчанию имеют формат ELF.Точка входа для инициализации не требуется, и функции не нуждаются в специальных объявлениях.Это делает разработку удобнее.

В отличие от создания статической библиотеки, не нужен инструмент упаковки (ar, lib.exe); динамическую библиотеку можно создать непосредственно с помощью компилятора.

3.2. Создание и использование динамических библиотек в Linux

3.2.1. Соглашения об именовании динамических библиотек в Linux

Имя динамически подключаемой библиотеки имеет вид libxxx.so, с префиксом "lib" и суффиксом ".so".

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

- В файловой системе soname — это всего лишь ссылка на фактическую динамическую библиотеку. Для динамических библиотек у каждой библиотеки также есть другое имя, которое использует компилятор. Это файл-ссылка, указывающий на фактический образ библиотеки (lib+soname+.so).

3.2.2. Создание динамической библиотеки (.so)

Напишите код динамической библиотеки для арифметических операций:

Заголовочный файл DynamicMath.h
#pragma once
class DynamicMath
{
public:
        DynamicMath(void);
        ~DynamicMath(void); 

        static double add(double a, double b);//加法
        static double sub(double a, double b);//减法
        static double mul(double a, double b);//乘法
        static double div(double a, double b);//除法
        void print();
};

- Сначала создайте объектный файл; на этом этапе добавьте опцию компилятора -fpic.

g++ -fPIC -c DynamicMath.cpp

-fPIC создаёт позиционно-независимый код (PIC), чтобы его можно было совместно использовать в нескольких приложениях.

- Затем создайте динамическую библиотеку; на этом этапе добавьте опцию компоновщика -shared.

g++ -shared -o libdynmath.so DynamicMath.o

-shared задаёт создание динамической библиотеки.

clip_image025[4]

Фактически, два вышеуказанных шага можно объединить в одну команду:

g++ -fPIC -shared -o libdynmath.so DynamicMath.cpp

3.2.3. Использование динамических библиотек

Напишите тестовый код, использующий динамическую библиотеку:

Тестовый код:
#include "../DynamicLibrary/DynamicMath.h"

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
    double a = 10;
    double b = 2;

    cout << "a + b = " << DynamicMath::add(a, b) << endl;
    cout << "a - b = " << DynamicMath::sub(a, b) << endl;
    cout << "a * b = " << DynamicMath::mul(a, b) << endl;
    cout << "a / b = " << DynamicMath::div(a, b) << endl;

    DynamicMath dyn;
    dyn.print();
    return 0;
}

Подключите динамическую библиотеку и скомпилируйте в исполняемый файл (так же, как со статической библиотекой):

g++ TestDynamicLibrary.cpp -L../DynamicLibrary -ldynmath

Затем запустите: ./a.out, и обнаружите, что он на самом деле выдаёт ошибку!!!

clip_image027[4]

Возможно, вы предположите, что это потому, что динамическая библиотека и тестовая программа находятся не в одном каталоге. Давайте проверим, так ли это:

clip_image029[4]

Он всё ещё выдаёт ошибку!!! Так как же определяется местоположение файлов разделяемых библиотек во время выполнения?

1) Когда система загружает исполняемый код, она может знать имена библиотек, от которых он зависит, но ей также нужно знать абсолютные пути. На этом этапе необходим системный динамический компоновщик/загрузчик.

2) Для исполняемых программ в формате ELF это делает ld-linux.so*. Он по порядку просматривает сегмент DT_RPATH ELF-файла, переменную среды LD_LIBRARY_PATH, список в файле /etc/ld.so.cache и каталоги /lib/ и /usr/lib, а найдя файл библиотеки, загружает его в память.

Как сделать так, чтобы система могла его найти:

- Если она установлена в /lib или /usr/lib, то ld может найти её по умолчанию без каких-либо дополнительных действий.

- Если она установлена в другом каталоге, её нужно добавить в файл /etc/ld.so.cache. Шаги следующие:

- Отредактируйте файл /etc/ld.so.conf и добавьте путь к каталогу, содержащему файл библиотеки.

- Выполните ldconfig; эта команда перестроит файл /etc/ld.so.cache.

Мы копируем созданную динамическую библиотеку в /usr/lib, а затем запускаем тестовую программу.

clip_image031[4]

3.3. Создание и использование динамических библиотек в Windows

3.3.1. Создание динамической библиотеки (.dll)

По сравнению с Linux создание динамической библиотеки в системе Windows немного сложнее. Во-первых, нужна функция DllMain в качестве точки входа инициализации (при создании консольного приложения Win32 выбор типа DLL автоматически создаст этот файл):

Входной файл dllmain.cpp
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Обычно при объявлении экспортируемых функций требуется ключевое слово _declspec(dllexport):

Заголовочный файл DynamicMath.h
#pragma once
class DynamicMath
{
public:
    __declspec(dllexport) DynamicMath(void);
    __declspec(dllexport) ~DynamicMath(void);

    static __declspec(dllexport) double add(double a, double b);//加法
    static __declspec(dllexport) double sub(double a, double b);//减法
    static __declspec(dllexport) double mul(double a, double b);//乘法
    static __declspec(dllexport) double div(double a, double b);//除法

    __declspec(dllexport) void print();
};

Чтобы создать динамическую библиотеку, необходимо задать свойства проекта. Откройте "Страницы свойств" проекта -> "Свойства конфигурации" -> "Общие" и выберите "Динамическая библиотека" для параметра "Тип конфигурации".

clip_image033[4]

Рисунок: v Настройки свойств проекта динамической библиотеки

Соберите проект, и динамическая библиотека будет создана.

3.3.2. Использование динамических библиотек

Создайте тестовую программу для консоли Win32:

Тестовая программа TestDynamicLibrary.cpp
#include "stdafx.h"
#include "DynamicMath.h"

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    double a = 10;
    double b = 2;

    cout << "a + b = " << DynamicMath::add(a, b) << endl;
    cout << "a - b = " << DynamicMath::sub(a, b) << endl;
    cout << "a * b = " << DynamicMath::mul(a, b) << endl;
    cout << "a / b = " << DynamicMath::div(a, b) << endl;

    DynamicMath dyn;
    dyn.print();

    system("pause");
    return 0;
}

Способ 1:

- В проекте откройте "Страницы свойств" -> "Общие свойства" -> "Платформа и ссылки" -> "Добавить ссылку"; откроется диалоговое окно "Добавить ссылку". На вкладке "Проекты" перечислены проекты текущего решения и все библиотеки, на которые можно сослаться. На вкладке "Проекты" выберите DynamicLibrary. Нажмите "ОК".

clip_image035[4]

- Добавьте каталог заголовочного файла DynamicMath.h; необходимо изменить путь к каталогу включаемых файлов. Откройте "Страницы свойств" проекта -> "Свойства конфигурации" -> "C/C++" -> "Общие". В значении свойства "Дополнительные каталоги включаемых файлов" введите путь или укажите каталог, содержащий заголовочный файл DynamicMath.h.

clip_image037[4]

Компиляция и запуск выполнены успешно.

clip_image038[4]

Рисунок: Результаты тестирования динамической библиотеки (VS)

Метод 2:

- "Страницы свойств" -> "Свойства конфигурации" -> "Компоновщик" -> "Общие"; в поле "Дополнительные каталоги библиотек" укажите каталог, содержащий динамическую библиотеку.

clip_image040[4]

- "Страницы свойств" -> "Свойства конфигурации" -> "Компоновщик" -> "Ввод"; в поле "Дополнительные зависимости" укажите DynamicLibrary.lib, созданный при компиляции динамической библиотеки.

clip_image042[4]

Здесь у вас может возникнуть вопрос: почему у динамической библиотеки тоже есть файл DynamicLibrary.lib? То есть, будь то библиотека статической компоновки или библиотека динамической компоновки, в итоге всегда есть файл lib. Так в чём же разница между ними? На самом деле это совершенно разные вещи.

clip_image044[4]

Размер StaticLibrary.lib составляет 190KB, а размер DynamicLibrary.lib — 3KB. lib-файл, соответствующий статической библиотеке, называетсястатической библиотекой, а lib-файл, соответствующий динамической библиотеке, называется [библиотекой импорта]. Фактически, сама статическая библиотека содержит фактический исполняемый код, таблицу символов и т. д., тогда какдля библиотеки импорта фактический исполняемый код находится в динамической библиотеке; библиотека импорта содержит только таблицу адресных символов и другую базовую адресную информацию, чтобы программа могла найти соответствующие функции.。

4. Явный вызов динамических библиотек

Описанный выше способ использования динамических библиотек аналогичен способу использования статических библиотек и относится к неявному вызову; во время компиляции указываются соответствующая библиотека и путь поиска. Фактически, динамические библиотеки можно также вызывать явно.[ВCязыке], явно вызвать динамическую библиотеку — проще простого!

4.1. Явный вызов динамических библиотек в Linux

#include <dlfcn.h> предоставляет следующие интерфейсы:

- void * dlopen(const char *pathname, int mode): Функция открывает указанный файл динамически подключаемой библиотеки в указанном режиме и возвращает дескриптор вызывающему процессу.

- void* dlsym(void* handle, const char* symbol): dlsym возвращает адрес, соответствующий символу, на основе дескриптора динамически подключаемой библиотеки (pHandle) и символа. С помощью этой функции можно получать не только адреса функций, но и адреса переменных.

- int dlclose(void *handle): dlclose используется для закрытия динамически подключаемой библиотеки с указанным дескриптором. Только когда счётчик использования этой динамически подключаемой библиотеки достигнет 0, она фактически будет выгружена системой.

- const char *dlerror(void): Когда функция работы с динамически подключаемой библиотекой завершается ошибкой, dlerror может вернуть информацию об ошибке. Возвращаемое значение NULL указывает, что функция операции была выполнена успешно.

4.2. Явный вызов динамических библиотек в Windows

Приложение должно выполнить вызов функции, чтобы явно загрузить DLL во время выполнения. Чтобы явно слинковаться с DLL, приложение должно:

- ВызватьLoadLibrary(или аналогичную функцию), чтобы загрузить DLL и получить дескриптор модуля.

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

- После использования DLL вызовитеFreeLibrary。

4.3. Что следует учитывать при явном вызове динамических библиотек C++

Для C++ ситуация немного сложнее. Сложность явной загрузки динамической библиотеки C++обусловлена частичноискажением имён C++;, а частично тем, что не предоставляется подходящийAPIдля загрузки классов, в C++ вам может потребоваться использовать класс из библиотеки, что требует создания экземпляра этого класса, и это не так просто сделать.

Искажение имёнЭто можно решить с помощью extern "C". В C++ есть специальное ключевое слово, используемое для объявления функций со связыванием C: extern "C". Функции, объявленные с extern "C", будут использовать имя функции в качестве имени символа, так же как функции C. Следовательно, только не являющиеся членами функции могут быть объявлены как extern "C", и их нельзя перегружать. Несмотря на множество ограничений, функции extern "C" всё ещё очень полезны, поскольку их можно динамически загружать с помощью dlopen так же, как функции C. Наличие квалификатора extern "C" не означает, что внутри функции нельзя использовать код C++. Наоборот, это по-прежнему полноценная функция C++, которая может использовать любые возможности C++ и различные типы параметров.

Кроме того, что касается того, как получать классы из динамических библиотек C++, вот несколько связанных статей, но я не рекомендую это делать:

- "Вызов класса в DLL через LoadLibrary":http://www.cppblog.com/codejie/archive/2009/09/24/97141.html

- «C++ dlopen mini HOWTO»:http://blog.csdn.net/denny_233/article/details/7255673

«Явное» использование классов в динамических библиотеках C++ очень громоздко и опасно, поэтому если возможно неявное использование, не используйте явное; если возможно статическое, не используйте динамическое.

5. Приложение: команды, связанные с библиотеками, в Linux

5.1. Параметры компилятора g++ (gcc)

- -shared: предписывает создавать динамическую библиотеку.

- -static: предписывает создавать статическую библиотеку.

- -fPIC: указывает на компиляцию в позиционно-независимый код; используется для компиляции разделяемых библиотек. Объектный файл должен быть создан как позиционно-независимый код, что концептуально означает, что при загрузке их исполняемой программой они могут быть размещены в любом месте памяти исполняемой программы.

- -L.: указывает каталог, в котором находится библиотека, подлежащая компоновке.

- -l: указывает динамическую библиотеку, необходимую во время компоновки. Компилятор имеет неявное правило именования при поиске динамических библиотек: добавляет «lib» перед заданным именем и «.a/.so» после него, чтобы определить имя библиотеки.

- -Wall: генерирует все предупреждающие сообщения.

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

- -g: компилятор генерирует отладочную информацию во время компиляции.

- -c: Выполнять только предварительную обработку, компиляцию и ассемблирование, то есть преобразовывать программу в объектный файл (файл .o).

- -Wl,options: Передавать параметры (options) компоновщику ld. Если в options есть запятые, разделите options на несколько параметров и затем передайте их программе компоновщика.

5.2. Команда nm

Иногда может потребоваться посмотреть, какие функции есть в библиотеке.nmкомандаОна может вывести все символы, участвующие в библиотеке. Библиотека может быть как статической, так и динамической. nm выводит много символов, и есть три распространённых типа:

- Один тип — это вызываемые в библиотеке, но не определённые в ней символы (это означает, что нужна поддержка из других библиотек), обозначаются U;

- Один тип — это определённые в библиотеке функции, обозначаются T, что встречается чаще всего;

- Один тип — это так называемые «слабые» символы. Хотя они определены в библиотеке, они могут быть переопределены символами с тем же именем в других библиотеках, обозначаются W.

$nm libhello.h

5.3. Команда ldd

lddКоманда позволяет просмотреть разделяемые библиотеки, от которых зависит исполняемая программа.Например, написанная нами динамическая библиотека арифметических операций зависит от следующих библиотек:

clip_image046[4]

6. Итоги

Разница между ними в том, чтовремя загрузки кода различается.。

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

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

Преимущество динамических библиотек в том, что если разные приложения вызывают одну и ту же библиотеку, в памяти требуется только один экземпляр разделяемой библиотеки. Наряду с преимуществами есть и проблемы! Например, классическая проблема DLL Hell. О том, как избежать проблем управления динамическими библиотеками, вы можете поискать соответствующие материалы самостоятельно.

7. Связанные руководства

Руководство по C++:http://www.w3cschool.cc/cplusplus/cpp-tutorial.html

Автор: Wu Qin
Источник: http://www.cnblogs.com/skynet/