c++;具有嵌套包含的库 我试图在C++中创建自己的库,并将它用于另一个项目中。 到目前为止,它可以使用示例代码,但我必须在自己的库中包含其他库。所以问题是,当我从库中包含头文件时, 头文件中的包含路径被弄乱了。 一个简单的解决方案是添加搜索目录,但我不认为, 这就是解决问题的方法

c++;具有嵌套包含的库 我试图在C++中创建自己的库,并将它用于另一个项目中。 到目前为止,它可以使用示例代码,但我必须在自己的库中包含其他库。所以问题是,当我从库中包含头文件时, 头文件中的包含路径被弄乱了。 一个简单的解决方案是添加搜索目录,但我不认为, 这就是解决问题的方法,c++,include,game-engine,glfw,glew,C++,Include,Game Engine,Glfw,Glew,示例代码-库头文件: #include <GL/glew.h> #include <GLFW/glfw3.h> int test(); 现在是我想要包含示例的项目 #include <sample.h> int main() { int a = test(); } #包括 int main(){int a=test();} 问题是,include将sample.h中的代码直接复制到main.cpp中,并且不再定义sample.h中其他include的搜索

示例代码-库头文件:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
int test();
现在是我想要包含示例的项目

#include <sample.h>
int main() { int a = test(); }
#包括
int main(){int a=test();}
问题是,include将sample.h中的代码直接复制到main.cpp中,并且不再定义sample.h中其他include的搜索目录

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

这当然是最简单的解决方案,因为它不需要对代码进行修改,而且通常是可以接受的——不过很明显,这意味着项目可以从
glew.h
glfw3.h
调用函数


唯一的替代方法是确保库头中不包含头,而是源中包含头

即:

库标题:

int test();
图书馆资料来源:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "sample.h"
int test() { return 20; }
您需要将其更改为:

库标题:

struct WindowHandle;
WindowHandle* openWindow(...);
图书馆资料来源:

struct WindowHandle{
    GLFWwindow* window;
};

WindowHandle* openWindow(...){
    WindowHandle* result;
    //... do stuff...
    result->window = //whatever;
    return result;
}
这种方法需要更改库代码,但有一个优点,即库的用户不能直接调用库所依赖的东西(在本例中为glew和glfw)。如果您想支持多个平台,这尤其有益,您可以通过glfw打开windows的源文件,并使用direct x打开另一个源文件。库的公共接口不需要更改以支持两个后端


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

哇,谢谢,这正是我想要的。还有一件事:到目前为止,当我创建一个链接到我的引擎库的项目时,我还必须链接到所有其他lib(glew32d、opengl32等)。有没有一个解决方案可以自动链接这些lib?嗯,好问题。我自己也遇到过同样的问题,只是针对依赖项进行了链接。对于像glew这样的开源软件,您可以将其源代码包含在您的库中,并将所有代码构建成一个(尽管这可能违反了他们的许可证,我还没有检查)。但这对于opengl32是不可能的,因为源代码不可用。也许我们可以看一看——尽管那里的普遍共识似乎也与依赖性相联系。
struct WindowHandle;
WindowHandle* openWindow(...);
struct WindowHandle{
    GLFWwindow* window;
};

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