Як користуватися бібліотеками


77

Чомусь я ніколи не можу користуватися зовнішніми бібліотеками жодною мовою. Я шукаю інструкції / пояснення щодо використання зовнішніх бібліотек, а також як вони працюють. Коли я шукаю в Інтернеті, я отримую фрагменти, які ніколи не стосуються будь-якої бібліотеки, яку я завантажую та намагаюся використовувати. Я працюю як на Mac, так і на ПК, і приклади на C ++ чудові. Я використовую eclipse IDE із підключеним C ++. Якщо є інструкції, які стосуються всіх бібліотек, це було б чудово.


1
Коли ви використовуєте, std::cout << "Hello World";ви користуєтесь бібліотекою. Чи можете ви бути більш конкретними?
Jesse Good

Ваше останнє запитання стосувалося #include <iostream>, тож ви їх якоюсь мірою використовували ні? Ваше запитання досить відкрите, спробуйте щось конкретне, а потім поставте запитання щодо цього.
Бендж

2
Я думаю, моє запитання показує, наскільки мало я знаю програмування. Я маю на увазі бібліотеки, які не вбудовані в мову (якщо це має сенс).
sinθ

6
Бібліотеки, які не є частиною мови, зазвичай називаються "Сторонні бібліотеки"
Роб Кілті,

Будь ласка, не просіть підручника. Ви повинні задати конкретне запитання щодо певної проблеми програмування. Оскільки Stack Overflow приховує від вас причину Close: "Питання, що вимагають від нас рекомендації чи пошуку книги, інструменту, бібліотеки програмного забезпечення, навчального посібника чи іншого позаресурсного ресурсу, не стосуються Stack Overflow, оскільки вони, як правило, залучають сумнівні відповіді та спам. Натомість опишіть проблему та те, що зроблено до цього часу для її вирішення ".
jww

Відповіді:


180

Скажімо, у вас є клас, Unusefulвизначений таким чином:

Файл Unuseful.h:

class Unuseful {
public:
    void printUnusefulStatement();
};

Файл Unuseful.cpp:

#include "unuseful.h"
#include <iostream>

void Unuseful::printUnusefulStatement()
{
    std::cout << "Hello world!" << std::endl;
}

Тепер у вас є інший клас, який потребує друку некорисних виписок:

Unuseful u;
u.printUnusefulStatement();

Це означає, що ви хочете використовувати зовнішню бібліотеку, що містить конкретну реалізацію ( printUnusefulStatement), яку ви хочете включити у свій код.

Ви можете використовувати цю бібліотеку двома способами:

  1. Надаючи компілятору вихідний код
  2. Надавши двійковий файл (який раніше був скомпільований для вашої архітектури), компонувальнику

Випадок 1: використання бібліотеки під час компіляції

Це найпростіший випадок. У вас є вихідний код бібліотеки, яким ви повинні скористатися, і вам просто потрібно скомпілювати його разом із наявним кодом (скажімо, main.cppфайлом). Зазвичай ви є автором і користувачем бібліотеки (класу, який виконує потрібне вам завдання).

Компіляція за допомогою цієї команди:

g++ main.cpp unuseful.cpp

дозволяє використовувати необхідну реалізацію у вашому main.cppфайлі.

Випадок 2: зв’язок бібліотеки

Частіше, ніж у випадку 1 , у вас немає вихідного коду бібліотеки, яку ви хочете використовувати. У вас є лише файл заголовка ( Unuseful.h, щоб продовжити приклад) і статична або спільна бібліотека (можливо, [*] libunuseful.aта libunuseful.soфайли відповідно).

Статична бібліотека - це архів об’єктних файлів ( *.o), які зв’язані всередині кінцевих виконуваних файлів, а спільні бібліотеки натомість завантажуються динамічно - під час виконання (дивіться на цій сторінці для кращого розуміння різниці ).

Статичні бібліотеки створюються простим архівуванням *.oфайлів за допомогою arпрограми:

# Create the object files (only one here)
g++ -c unuseful.cpp
# Create the archive (insert the lib prefix)
ar rcs libunuseful.a unuseful.o

Спільні бібліотеки створюються з g++ -sharedопцією:

# Create the object file with Position Independent Code[**]
g++ -fPIC -c unuseful.cpp
# Crate the shared library (insert the lib prefix)
g++ -shared -o libunuseful.so unuseful.o

Припустимо, тепер у вас є Unuseful.hфайл і спільна бібліотека ( libunuseful.soфайл), і у вас є main.cppфайл, який створює екземпляр Unusefulоб’єкта і викликає printUnusefulStatementметод.

Якщо ви спробуєте скомпілювати цей файл ( g++ main.cpp), компонувальник скаржиться, оскільки не може знайти printUnusefulStatementсимвол.

Пора користуватися бібліотекою:

g++ main.cpp -L. -lunuseful

-LОпція повідомляє компоновщик , де шукати бібліотеки файлів і -lпрапор вказує компоновщик ім'я бібліотеки , які будуть використовуватися (безlib префікса).

Тепер виконуваний файл ( a.outтому що я не вказав інше ім'я) створений, і ви використали бібліотеку для реалізації потрібної вам функціональності ( printUnusefulStatement).

Оскільки спільна бібліотека завантажується під час виконання, виконання a.outвиконуваного файлу може бути невдалим, оскільки система не може знайти бібліотеку. Зазвичай це може бути вирішено шляхом відповідного встановлення змінної середовища, що вказує, які шляхи використовувати для пошуку динамічних бібліотек:

# Set the LD_LIBRARY_PATH [*]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

Готово, тепер ваш виконуваний файл скомпільовано, і він зможе запустити та завантажити потрібну йому бібліотеку.

Висновок

Це швидкий огляд бібліотек, який, я сподіваюся, може допомогти вам зрозуміти, як вони використовуються та надаються іншим.

Є багато багатьох аспектів, які слід дослідити більш докладно, якщо вас це цікавить: g++параметри під час створення спільних бібліотек, arпараметри, змінні середовища, формат спільних бібліотек тощо.

[*]: У середовищі Unix

" Цей параметр має значення для m68k, PowerPC та SPARC. Незалежний від позиції код вимагає спеціальної підтримки, тому працює лише на певних машинах. [Зі сторінки довідки g ++]


6
щойно знайшов це ... велике спасибі за це чітке пояснення. У мене був загальний процес, але дрібні подробиці мене

6

Ось з чого ви починаєте http://en.wikipedia.org/wiki/Library_(computing)

В основному, "бібліотека" - це колекція скомпільованих функцій та оголошень класів.

На Mac є також "фреймворки", які чимось схожі на одиниці Паскаля і містять як оголошення, так і скомпільований код.

В таких керованих мовах, як Java або C #, є пакети та збірки. Обидва вони тісно пов’язані з бібліотеками.

Для використання бібліотек на C або C ++ ви повинні мати файл .lib (або .a-файл для більшості компіляторів на основі POSIX або GCC) та прототипи функцій, які компілюються у файл .lib. Залежно від вашого середовища розробки (для Eclipse ви, швидше за все, використовуєте компілятор GCC та ланцюжок інструментів GNU з LD linker), ви просто вказуєте файли бібліотеки (.lib або .a) як вхідні дані для компонувальника. Більшість часу бібліотека супроводжується файлами заголовків, які містять визначення прототипів функцій.

Навіть якщо ви не знали про компоновщик, що досить дивно, бібліотеки все одно використовуються у вашій програмі неявно - std :: cout знаходиться у libstdc ++ або бібліотеці виконання C.

Як приклад величезної бібліотеки та корисного набору класів C ++ ви можете подивитися на Boost.

Для написання графічного інтерфейсу в Windows ви можете використовувати WinAPI, який описаний у MSDN.

Для написання графічного інтерфейсу на Mac ви можете використовувати Carbon API, який чимось схожий на WinAPI, але зараз застарілий. Єдиний спосіб написати "законний" графічний інтерфейс для MacOS - це використовувати какао та Objective-C.

Для написання крос-платформного графічного інтерфейсу ви можете використовувати багато бібліотек: серед них Qt, wxWidgets, GTK.

Останнє, але не в останню чергу. C ++ - не найкраща мова для графічного інтерфейсу.


9
Цей останній пункт трохи спірний, найкращий! = Найпростіший, багато серйозних інтерфейсів все ще написані на C ++. Наприклад, усі браузери, включаючи Chrome, який є новим і мав безліч альтернатив, коли був розроблений.
Benj

2
ГАРАЗД. Я згоден. Все залежить. Коли портативність спадає на думку, не над чим думати, а про C / C ++. Однак інтерфейс може бути реалізований специфічно для платформи, а C ++ може бути використаний для всієї бізнес-логіки.
Віктор Латипов

Останнє, про яке ви сказали, ніби ми можемо використовувати іншу мову для написання графічного інтерфейсу, а C ++ використовується лише для ядра? Як це?
Star Light

2

Найкращий спосіб використовувати зовнішні бібліотеки C ++ - скористатися менеджером пакетів C ++, перейти і дізнатися про них;

Деякі з них пов'язані з використанням CMake, ви можете знайти добре написаний підручник з нього тут .

.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.