Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
4 / 4 / 0
Регистрация: 28.10.2015
Сообщений: 51

Включение библиотеки в библиотеку

31.01.2017, 01:12. Показов 5023. Ответов 6
Метки нет (Все метки)

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

Для теста создал библиотеку для создания окна при помощи GLFW. Создал пустой проект, в настройках выбрал Configuration type - static library, в разделе C/C++ Additional indclude derictories указал адрес папки include библиотеки GLFW, в разделе Librarian прописал зависимости и путь к папке с либами. Накидал такой код
Кликните здесь для просмотра всего текста
.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#pragma once
#include <glfw3.h>
 
class Window
{
public:
    static GLFWwindow* Get();
    static bool Create(int width, int height, const char* title);
    static void Update();
    static bool open;
 
private:
    Window();
    ~Window();
    static GLFWwindow* window;
};
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "Window.h"
 
GLFWwindow* Window::window;
bool Window::open;
 
Window::Window()
{
 
}
 
Window::~Window()
{
 
}
 
GLFWwindow* Window::Get()
{
    return window;
}
 
bool Window::Create(int width, int height, const char* title)
{
    if (!glfwInit())
        return false;
 
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    window = glfwCreateWindow(width, height, title, nullptr, nullptr);
    if (window == nullptr)
        return false;
 
    glfwMakeContextCurrent(window);
    open = true;
    return true;
}
 
void Window::Update()
{
    glfwPollEvents();
    glfwSwapBuffers(window);
}

Скомпелировал все нормально, в новом проекте подключаю эту библиотеку, он мне пишет
Error C1083 Cannot open include file: 'glfw3.h': No such file or directory
Я подключаю к этому проекту непосредственно GLFW - всё работает. В общем моя библиотека работает на половину, т.е. работает мой код, но всё равно приходится вручную подключать к новому проекту все библиотеки которые включены в мою библиотеку. Скажите как правильно включать библиотеки в другие библиотеки, очень не хочется таскать все эти сопли.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2017, 01:12
Ответы с готовыми решениями:

Включение библиотеки
Не работает включение include &lt;stream.h&gt; Подскажите, пожалуйста, что сделать, чтобы заработало или чем можно заменить

Ошибка при подключении библиотеки: "Не удается открыть включение"
Появляется ошибка в библиотеке где взять эту библиотеку? не могу понять Вот ошибка #include &lt;number_of_plants.h&gt; int...

Ссылка на библиотеку из библиотеки
Всем привет! Ребят, подскажите пожалуйста. Речь о .Net Core Есть две библиотеки. Одна ссылается на другую. в сборках у первой вторая...

6
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
31.01.2017, 01:23
Цитата Сообщение от Gypnori Посмотреть сообщение
Скажите как правильно включать библиотеки в другие библиотеки
Еще раз: о чем именно идет речь? О включении заголовочных файлов, типа glfw3.h? Или о подключении именно скомпилированных библиотек?

На всякий случай замечу, что glfw3.h - это никакая не "библиотека", и "библиотекой" никогда не называлось.
0
4 / 4 / 0
Регистрация: 28.10.2015
Сообщений: 51
31.01.2017, 03:04  [ТС]
Сразу оговорюсь я не спец в плюсах, а уж тем более в его инфраструктуре, попробую объяснить проблему на примере описанном выше, я создал статическую библиотеку которая включает класс для работы с окном и библиотеку glfw, подключил полученную библиотеку к новому проекту, а он ругается что не подключена glfw, и заставляет меня подключить glfw непосредственно к новому проекту, почему? Ведь она по идее должна быть включена в мою библиотеку, и чтобы всё работало мне опять же по идее нужно всего лишь подключить к проекту свою библиотеку.
На всякий случай замечу, что glfw3.h - это никакая не "библиотека", и "библиотекой" никогда не называлось.
Да, я понял это заголовчный файл через который осуществляется работа с библиотекой glfw. Просто новички путают термины и понятия, из за чего трудно понять о чём идёт речь
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
31.01.2017, 03:37
Лучший ответ Сообщение было отмечено Gypnori как решение

Решение

Цитата Сообщение от Gypnori Посмотреть сообщение
Ведь она по идее должна быть включена в мою библиотеку, и чтобы всё работало мне опять же по идее нужно всего лишь подключить к проекту свою библиотеку.
В "традиционной" сборочной инфраструктуре С/С++ библиотеки сами по себе никогда друг в друга не включаются. При сборке библитеки другие библиотеки соврешенно не нужны и даже понятия такого, как включение других библиотек при сборке какой-то новой библиотеки нет. Библиотеки обрабатюваются на этапе линковки выполняемого файла, а при сборке самих библиотек такого этапа просто нет. Библиотка - это просто архив/свалка разрозненных объектных файлов.

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

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

Но это извращение. Так просто не делают.

О каком-то физическом вкладывании библиотек друг в друга может идти речь при компиляции динамичекой библиотеки (DLL, .so и т.п.), но у вас, как я понимаю, речь идет не об этом.
1
4 / 4 / 0
Регистрация: 28.10.2015
Сообщений: 51
31.01.2017, 04:02  [ТС]
Спасибо за объяснение, сейчас читаю документацию SFML, помню что в неё было включено множество сторонних библиотек, тут как раз написано что при статическом связывании, все сторонние модули подключаются отдельно.

Starting from SFML 2.2, when static linking, you will have to link all of SFML's dependencies to your project as well. This means that if you are linking sfml-window-s.lib or sfml-window-s-d.lib for example, you will also have to link opengl32.lib, winmm.lib and gdi32.lib. Some of these dependency libraries might already be listed under "Inherited values", but adding them again yourself shouldn't cause any problems.
Я думал что все можно в один файл упихнтуь
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
31.01.2017, 04:24
Цитата Сообщение от Gypnori Посмотреть сообщение
все сторонние модули подключаются отдельно
Если речь идет о Visual Studio, то там есть альтернативный способ включения библиотек в проект - через написание #pragma comment(lib, <имя файла библиотеки>) прямо в исходном коде, а не через настройки компилятора. В некоторых случаях такой способ может оказаться полезным, в том смысле, что такую #pragma можно поместить прямо в заголовочный файл вашей библиотеки (а также включить #pragma для всех библиотек, которые ей еще нужны), и в результате создастся некое подобие автоматического подключения всех необходимых библиотек без каких-либо усилий с вашей стороны. Подключил заголовочный файл - и вместе с ним автоматически подключились все библиотеки.

Подлежащий механизм при этом остается традиционным, т.е. физически библиотеки будут подключаться на самом верхнем уровне - при построении выполняемого файла. Ну и пути к местоположениям библиотечных файлов все равно надо будет настраивать.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2017, 15:03
Цитата Сообщение от Gypnori Посмотреть сообщение
Я думал что все можно в один файл упихнтуь
что такое статическая либа?
это просто архив объектных файлов.
там внутри - кучка обжей.

что значит "объединить две статические либы"?
это значит разобрать архив на запчасти, повыковыривав из них обжи,
а потом пересобрать lib заново, запихав все эти обжи в одну либку.

теперь как это можно сделать?

я такое проделывал только в вижуал студии.
1.
там если полазить в настройках есть опция "влинковать все зависимости"

2.
как вам уже сказали выше:
#pragma comment(lib, <имя файла библиотеки>)

3.
относительно универсальный способ:
смотрим в сторону линкера.

линкер вижуал студии под название lib.exe
умеет это делать:

https://msdn.microsoft.com/ru-... b885t.aspx

на cmake я делал это так:
Code
1
add_custom_target(combined ALL COMMAND lib /out:combined.lib  ${LIBRARIES}  $<TARGET_FILE:${PROJECT_NAME}> )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.01.2017, 15:03
Помогаю со студенческими работами здесь

ошибка при включение собственной библиотеки в проект
Всем привет! Подскажите как победить ошибку при компиляции gcc plug-in: Error: Object file not found on expected location...

Включение динамической библиотеки под Windows x32 и Android - NEED HELP
Доброго времени суток уважаемые форумчане нужна ваша помощь или пояснения, что я делаю не так.... Работаю в: RAD Studio 10.2 Цель:...

Подключение статической библиотеки, которая сама в себя включает другую статическую библиотеку
Есть проект с подпроектами в QtCreator. Допустим есть три проекта: 1. Статическая библиотека A 2. Статическая библиотека B, которая...

Включение пункта меню после включение чекбокса
Как правильно сделать, чтобы наличие галочки screenTimeOutTile пункта настроек включало неактивный следующего typeScreenTimeOut правильно? ...

Захотел я установить библиотеку, а получил не библиотеку - под катом
Захотел я установить библиотеку premailer, как обычно через pip устанавливаю, окно консоли поморгало и исчезло. Ну думаю все ок, а в коде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru