我正在为我的项目开发一个API,我想在未来的项目中使用这个API。问题是我如何暴露它:
API使用了很多库,我不希望客户端代码一遍又一遍地下载和编译这些库。所以我的解决方案是这样做:
Engine.hpp
class __declspec(dllexport) Engine
{
public:
Engine();
~Engine();
public:
void run_window();
// std::vector<UI::Window*> window_list;
};
std::string __declspec(dllexport) get_version();
现在这个工作,因为它是,但我想添加一些其他的类,我已经创建到这个公开的类,但问题出现时,我试图包括我的类,这是依赖于一个类(在这种情况下,GLFW)。这个类看起来像这样:
Window.hpp
#include <GLFW/glfw3.h>
class Window{
public:
Window(std::string name);
...
private:
GLFWwindow* m_window;
};
因此,尝试使用UI::Window自然会导致一个预编译错误,说它找不到GLFW头文件,这不包括在客户端代码的cmake中。就我而言,引擎中的库函数应该与我的代码一起编译,并且应该包含在.dll和.lib文件中,但我得到了预期的包含错误。
我对API设计有点陌生,所以有没有一种方法/最佳实践可以将我的库依赖代码暴露给客户端,而不必让他们导入每个库?
我可以在Engine的cpp文件中使用静态变量,但我希望这些变量是类成员,并且我希望客户端能够访问其中的一些变量。
1条答案
按热度按时间wljmcqd81#
您在编译单元中使用
#include
操作Window.hpp,而Window.hpp包含#include <GLFW/glfw3.h>
,这就是编译器尝试做的事情。它不知道你为什么要包含glfw3.h,只是你告诉它这样做,它找不到那个文件。幸运的是,你实际上并不需要glfw3.h。由于
Window
只包含一个指向GLFWwindow
的 * 指针 *,因此不需要在其头部中完整定义GLFWwindow
;它只需要知道它是一个存在的类。你告诉它使用forward-declaration:然后在Window.cpp中,您可以
#include
完整的glfw3.h头,以便在那里定义的Window
成员函数知道该做什么。这很好,因为在编译程序时不需要编译Window.cpp(仅在编译库时)。但是你仍然需要将你的程序链接到glfw库。