带有嵌套包含的c ++库

时间:2016-07-24 10:25:18

标签: c++ include game-engine glfw glew

所以我正在尝试用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中,而不再定义sample.h中其他包含的搜索目录

1 个答案:

答案 0 :(得分:0)

  

一个简单的解决方案是添加搜索目录,但我不认为,这就是它应该如何解决。

这当然是最简单的解决方案,因为它不需要修改代码,并且通常是可接受的事情 - 但显然这意味着项目可以从glew.hglfw3.h <调用函数/ p>

唯一的选择是确保标头不包含在库标题中,而是由源代码包含。

IE:

图书馆标题:

int test();

图书馆资料来源:

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

项目的源文件保持不变。

这要求glew.hglfw3.h中定义的类型不属于您的库公开的公共接口。

例如,如果您的图书馆具有以下功能:

GLFWwindow* window = openWindow(...);

您需要将其更改为:

图书馆标题:

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

图书馆来源:

struct WindowHandle{
    GLFWwindow* window;
};

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

这种方法需要更改库代码,但其优点是库的用户无法直接调用库所依赖的东西(在本例中为glew和glfw)。如果你想支持多个平台,你可以有一个用于通过glfw打开窗口的源文件,另一个使用direct x,这是特别有用的。不需要更改库的公共接口以支持两个后端。

如果您想了解有关此方法的更多信息,请尝试搜索“不透明数据类型”