公开API的正确方法c++

zazmityj  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(127)

我正在为我的项目开发一个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文件中使用静态变量,但我希望这些变量是类成员,并且我希望客户端能够访问其中的一些变量。

wljmcqd8

wljmcqd81#

您在编译单元中使用#include操作Window.hpp,而Window.hpp包含#include <GLFW/glfw3.h>,这就是编译器尝试做的事情。它不知道你为什么要包含glfw3.h,只是你告诉它这样做,它找不到那个文件。
幸运的是,你实际上并不需要glfw3.h。由于Window只包含一个指向GLFWwindow的 * 指针 *,因此不需要在其头部中完整定义GLFWwindow;它只需要知道它是一个存在的类。你告诉它使用forward-declaration:

class GLFWwindow;

class Window{
public:
   Window(std::string name);
   ...
private:
   GLFWwindow* m_window;
};

然后在Window.cpp中,您可以#include完整的glfw3.h头,以便在那里定义的Window成员函数知道该做什么。这很好,因为在编译程序时不需要编译Window.cpp(仅在编译库时)。
但是你仍然需要将你的程序链接到glfw库。

相关问题