2016-07-24 12 views
-1

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

Пример кода - Библиотека файл заголовка:

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
int test(); 

Исходный файл:

#include "sample.h" 
int test() { return 20; } 

Сейчас проект, в котором я хочу, чтобы включить образец

#include <sample.h> 
int main() { int a = test(); } 

Проблема заключается в том , что include копирует код из sample.h непосредственно в main.cpp и каталоги поиска для ot ее включения из образца.h больше не определены

ответ

0

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

Это, безусловно, самым простым решением, так как он не требует каких-либо изменений в коде, и, как правило, является приемлемым, что нужно сделать - однако, очевидно, это означает, что проект может вызывать функции из glew.h и glfw3.h


Единственная альтернатива - гарантировать, что заголовки не включены в заголовок библиотеки, а вместо этого источником.

IE:

Библиотека Заголовок:

int test(); 

библиотека Источник:

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include "sample.h" 
int test() { return 20; } 

и исходный файл проекта остается неизменным.

Для этого необходимо, чтобы типы, определенные в glew.h и glfw3.h, не были частью открытого интерфейса, выставленного вашей библиотекой.

Например, если ваша библиотека была функция, как:

GLFWwindow* window = openWindow(...); 

Вы должны были бы изменить его на:

Библиотека Заголовок:

struct WindowHandle; 
WindowHandle* openWindow(...); 

библиотека Источник:

struct WindowHandle{ 
    GLFWwindow* window; 
}; 

WindowHandle* openWindow(...){ 
    WindowHandle* result; 
    //... do stuff... 
    result->window = //whatever; 
    return result; 
} 

Этот подход h требует изменения кода библиотеки, но имеет то преимущество, что пользователи библиотеки не могут напрямую вызывать то, на что зависит библиотека (glew и glfw в этом случае).Это особенно полезно, если вы хотите поддерживать несколько платформ, у вас может быть исходный файл для открытия окон через glfw, а другой - с помощью прямого x. Публичный интерфейс библиотеки не нуждается в изменении для поддержки обоих бэкэндов.

Если вы хотите узнать больше об этом подходе попробуйте найти «Непрозрачные тип данных»

+0

Wow спасибо, это именно то, что я искал. Еще одна вещь: пока я создаю проект, который связан с моей машинной библиотекой, мне нужно также соединить все другие библиотеки (glew32d, opengl32 и т. Д.) Есть ли решение, в котором они автоматически связаны? –

+0

Хм, хороший вопрос. У меня была одна и та же проблема, и я просто связываюсь с зависимостями. В случае чего-то открытого источника, такого как glew, вы можете просто включить его источник в свою библиотеку и построить целую партию в одну (хотя это может быть против их лицензии, я не проверял). Это невозможно для opengl32, хотя источник недоступен. Возможно, взгляните на http://stackoverflow.com/questions/5445023/c-can-you-build-one-static-library-into-another, хотя общий консенсус, похоже, связан с зависимостью, как Что ж. – jtedit

 Смежные вопросы

  • Нет связанных вопросов^_^