Чи слід додати джерело бібліотек замість посилання на них?


14

Я відносно новий в C ++, тому не знаю, як мені найкраще впоратися з малими залежностями (наприклад, мовою сценаріїв або JSON / YAML / XML Parser).

Чи слід створювати окремі проекти та пов'язувати їх як статичну бібліотеку, чи є недоліки просто ввести файли .h / .cpp в основний проект?

Останнє здається набагато простішим, оскільки я кілька годин займався несумісними бібліотеками (різні налаштування компілятора при створенні бібліотеки), але я не хочу починати вивчати C ++ з неправильного шляху.

Якщо бажано зберігати їх як окремі бібліотеки, то як я найкраще зберігати прапорці компіляції синхронізовано, щоб файли .lib / .a успішно посилалися на мою програму?

(Зараз я працюю з MSVC 2015, але мета - компілювати в Mac OS X і iOS за допомогою XCode / clang, так що мені доведеться мати справу щонайменше з 3 різними типами бібліотек (Win x86, Mac x64, ARM) )


5
Погляньте на ABIss, і вони заглянуть у вас
Василевс

1
Майте на увазі, що деякі бібліотеки призначені для використання таким чином. У SQLite краща модель використання бібліотеки є впустити амальгованих джерело та заголовки у вихідному дерево додатки C або C ++ для компілюється в виконуваний файл.
Марк Беннінгфілд

Відповіді:


6

TLDR;

Чи слід додати джерело? ТАК
Чи повинен X додати джерело? ЗАВИСИМО

Ось чому ...

Ще в той час час складання був проблемою, навіть менші проекти мали. Компіляція ваших джерел і ніколи не турбуючись про кешування результатів компілятора напевно була привабливою для деяких. Це один момент, який стосується бібліотек, які не стосуються вас.

Ще одна важлива - версія. Вам справді потрібно версії кожної бібліотеки окремо? Провести тести проти кожного? Розподілити його серед багатьох членів команди? Бібліотеки - це чудово, якщо ви це робите, і зручно пересуватися, але, здається, вам це теж не байдуже.

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

Я все це знаю з досвіду:

Для проектів Swift я обов'язково використовую фреймворки (бібліотеки) і посилаюся на них, оскільки це легко налаштувати за допомогою Xcode. Мені також дуже потрібні версії, тести та розв'язка, тому саме тому.

Для проектів Mono (C #), для Unity, я почав із підхідного механізму розбиття проекту на бібліотеки, складання та тестування кожної, що було чудово ... але, як тільки я перекинув бібліотеки в Unity, траплялися всілякі питання , від зламаної версії Mono Unity, що використовується, щоб просто іноді відрізнятись поведінкою, який проявляє код при зміні платформ. Немає тут єдиного IDE для управління всіма бібліотеками було справжнім болем, тому розміщення всього джерела в Unity було величезною виграшю для продуктивності.

Нарешті, найбільш важливий для вас ігровий проект C ++, над яким я працював. Для цієї гри було написано ігровий движок, мережевий клієнт у режимі реального часу, мережевий клієнт HTTP, AI та магазин збереження. Що я обрав? CLion + Бібліотеки. Хоча я користувався бібліотеками, це не здавалося мені. Усі джерела були в проекті CLE IDE, і, склавши CMakeLists, я зміг запустити всі збірки та з'єднати їх одним штрихом.

Як висновок , я б сказав, що використання бібліотек є надійним рішенням, але також передчасною оптимізацією, якщо вона не потрібна. Наскільки я міг констатувати з вашої ситуації, перехід з MSVC на Xcode буде болем, якщо ви збираєтеся мати кілька цілей збірки. Так, просто помістіть його в і підтримувати такий же ізоляції , наскільки це можливо для того, коли час , коли ви могли б знадобитися використання бібліотек.

PS: У мене сьогодні схожа дилема з докером. Чи слід писати? Чи варто просто бігати локально? .. і т. д. Також Elixir, оскільки він дозволяє створювати програми в межах однієї програми. Чи потрібно це робити? Або розділити додаток на так звані мікросервіси? ... і т. д. Срібної кулі немає, завжди міряй себе, як YMMV.


2

Зв'язок з бібліотеками C ++ вимагає багато клопоту, і для правильного його виконання потрібно багато знань і зусиль. Це може залякати учнів, які навчаються на C ++.


Часто автори / керівники певної бібліотеки C ++ матимуть це на увазі і рекомендуватимуть так чи інакше.

Іншими словами, якщо автори / підтримувачі мають намір включити бібліотеку до заголовків (* .h та .hpp тільки) або включити за джерелом ( .h * або .c ), це було б чітко сказано в readme або документацію.


Бібліотеки, які розроблені та підтримуються для крос-платформних (і сумісних з декількома постачальниками компіляторів C ++ та середовищами), часто матимуть систему makefile або систему конфігурації збірки (наприклад, CMake). Ці системи використовуються для генерування заголовків заголовків, які згладжують відмінності платформи, та для створення сценаріїв, які викликатимуть компілятор та лінкер у вихідних файлах, використовуючи відповідні параметри командного рядка та у правильній послідовності. Залежно від платформи та конфігурації, ці системи побудови можуть включати або виключати певні заголовки або вихідні файли, або вони можуть визначати або визначати певні символи препроцесора.


Можливо, суперечити рекомендаціям авторів / підтримуючих, але це завжди вимагає великих зусиль з перенесення. Обсяг роботи, необхідний для цього переносу, може бути порівнянним з перенесенням до іншого середовища C ++.


Оскільки Visual C ++ використовує власну систему збирання на основі файлу опису проекту (почасти на основі XML), це зовсім не схоже на систему побудови на основі сценаріїв, що використовується в Linux. Підхід, який застосовує CMake, призначений для CMake приймати параметри конфігурації, а потім випромінювати всю структуру проекту Visual C ++ з параметрами конфігурації, записаними у файли * .vcxproj.

Якщо під час з'єднання C ++ з Visual C ++ виникають проблеми, налаштування збірки у файлах * .vcxproj можна змінити за допомогою графічного інтерфейсу Visual Studio (використовуючи діалогове вікно сторінок властивостей проекту). Це передбачає, що ви добре розумієте значення та наслідки десятків важливих параметрів компіляції та зв’язку C ++.

Тепер настає найглупіша частина використання Visual C ++: якщо ви використовуєте десяток різних сторонніх бібліотек, зміна налаштувань збірки для всіх них означає зайти в кожен * .vcxproj файл і повторити однакові зміни в GUI для десятка. разів. Неприємності, але це можна зробити, якщо ви знаєте, як це зробити правильно.

Більшість учнів, які навчаються Visual C ++, вивчають ці налаштування важким шляхом, спостерігаючи помилки компілятора та лінкера Visual C ++, ідентифіковані кодом помилки. Наприклад, можна шукати LNK2005 з поверхневим значенням "Символ символу був визначений не один раз", але з розумінням того, що дублікат визначення не виникає з необережної помилки програмування, натомість це могло статися через деякі конфлікти чи неправильне застосування варіантів компіляції та зв’язування.


Щоб надати більш конкретну та корисну відповідь на вашу ситуацію, потрібно буде знати назви бібліотек, які ви збираєтесь використовувати, а також помилки зв’язку чи інші труднощі, з якими ви стикаєтесь. Ви можете знайти відповіді на ці запитання у відповідних колегіях обговорень бібліотеки. Ці питання, як правило, позначаються "пов'язаними питаннями", "вікнами" та "візуальними C ++".

Посібник для початківців-експертів з цього питання можливий, але це буде конкретним проектом. Різні уподобання, обрані різними проектами, потребують повного перепису керівництва.


Якщо ви використовуєте CMake для випромінювання .vcxproj, а не для модифікації .vcxproj, ви можете змінити конфігурацію CMake
Caleth,

1

Я б сказав так, доки це легше. Переваг дуже багато:

  1. Це призведе до швидшого та кращого коду, особливо якщо ви ввімкнули оптимізацію часу зв’язку.

  2. Ваш IDE сподобається йому більше, наприклад, він (сподіваємось) дозволить вам перейти до реалізації (.cpp) бібліотечного коду, а не тільки до інтерфейсу (.h), що надзвичайно корисно при роботі з погано задокументованим кодом (тобто найбільш код).

  3. Це часто дозволяє додати залежність як підмодуль git, що є трохи хакітним, але насправді досить хорошим способом мати залежності (для C ++ у будь-якому випадку, в якому майже немає розумних систем побудови). Оновити бібліотеку та тестувати різні версії це дуже просто.

  4. Вам не потрібно турбуватися про компіляцію залежності з MSVC ++ 2013, хоча ви, наприклад, використовуєте 2017 рік. Або спільний та статичний MSVCRT.

  5. Ви можете легко побудувати в режимі налагодження і зайти в бібліотеку.

Єдина причина, на яку я думаю, ви цього не зробили б хотіли цього робити, - це те, якщо бібліотека велика і має складну систему складання, яку ви не хочете копіювати у своїй, наприклад, Boost або LLVM. Але для простих бібліотек насправді немає недоліків.

Як приклад, я використовую libusb в кількох проектах, і мені потрібно підтримувати Windows. libusb використовує autotools, що є жартом системи побудови, і в будь-якому разі не працює на Windows. Вони надають попередньо складені бінарні файли, але вони створені за допомогою MSVC ++ 2013 і не працюватимуть з 2017 року. Найпростішим рішенням на сьогоднішній день було лише додати всі відповідні файли .c та .h до мого проекту.


2
1) справді? Статична бібліотека - це лише колекція об'єктних файлів, подібно до того, якби ви їх щойно склали.
Baldrickk

Ви можете зробити архів .oфайлів, які були складені, -fltoале вони насправді не є статичною бібліотекою - для Clang це файли бітових кодів LLVM. І це, очевидно, не буде працювати, якщо ви використовуєте статичні бібліотеки, які надає хтось інший.
Timmmm

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