C++ - 导出 C++ 库公共部分的正确方法

Posted

技术标签:

【中文标题】C++ - 导出 C++ 库公共部分的正确方法【英文标题】:C++ - Proper way to export public parts of C++ library 【发布时间】:2013-01-24 16:39:29 【问题描述】:

我的 ./mylib/src 目录中有以下文件。我希望对用户隐藏此位置的任何内容。

message.h 文件(在 ./mylib/src 中)

// Include guard
namespace MyLib

    class Message
    
    public:
        Message();
        virtual ~Message() = 0;

        virtual bool ToString(std::string& rstrOutput);
        bool IsEmpty() const;

    protected:
        void DoStuff();

    private:
        Message(const Message&); // Disable
        Message& operator=(const Message&); // Disable

    private:
        int m_nData;
    ;

request.h 文件(在 ./mylib/src 中)

// Include guard
#include "message.h"

namespace MyLib

    class Request : public Message
    
    public:
        Request();
        ~Request();

        bool ToString(std::string& rstrOutput);

    private:
        bool Build();

    private:
        bool m_b;
    ;

response.h 文件(在 ./mylib/src 中)

// Include guard
#include "message.h"

namespace MyLib

    class Response : public Message
    
    public:
        Response();
        ~Response();

        std::string GetSomething() const;
    ;

当我分发我的库时,我想让用户#include 仅一个头文件(例如 ./mylib/include/mylib/mylib.h)并使用请求和响应。所以我创建了一个像这样的大头文件:

mylib.h 文件(在 ./mylib/include/mylib 中)

// Include guard
#include <string>

namespace MyLib

    class Message
    
    public:
        Message();
        virtual ~Message() = 0;

        virtual bool ToString(std::string& rstrOutput);
        bool IsEmpty() const;
    ;

    class Request : public Message
    
    public:
        Request();
        ~Request();

        bool ToString(std::string& rstrOutput);
    ;

    class Response : public Message
    
    public:
        Response();
        ~Response();

        std::string GetSomething() const;
    ;


#endif

但问题是每次我对库的公共部分进行更改或添加新类时,我都必须更新 mylib.h 文件,这很不方便。有什么更好的方法来实现同样的目标?

【问题讨论】:

提供一个包含所有其他头文件的头文件。好吧,我的意思是包括#include &lt;other_header.h&gt;:P 编译器?平台?请提及 两个平台:Windows (VC2010) 和 Linux (Eclipse CDT + Cygwin GCC) 【参考方案1】:

我会从“/src”中删除三个单独的标头,并在我的实现文件(位于“/src”中)中使用“/include”中的一个公共标头。在编译期间,您只需正确设置包含路径即可使其正常工作。

【讨论】:

我的 mylib.h 文件只包含公共内容。因此,如果我删除了我的 message.h、request.h 和 response.h,我将在哪里定义说 bool Request::Build()? 您可以在文件“./mylib/src/request.cpp”中定义它。 然后我得到“/src/request.cpp:21:14: error: 'Build' was not declared in this scope”错误。 如果我删除了 message.h 和 request.h,我还会把“int m_nData”或“bool m_b”放在哪里?【参考方案2】:

您可以将其设为 lib 或 dll,并且用户只会调用公共 API,如果您想为用户提供标头,则可以要求用户包含 /exportFolder 中的所有内容。或如先前评论中所述。或者就像你所做的那样,那个大标题就足够了。除非某些相关类发生更改,否则您不会修改它。这是正常的。

【讨论】:

以上是关于C++ - 导出 C++ 库公共部分的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

导出 DLL C++ 类,关于 .def 文件的问题

VS2019 C++动态链接库的创建使用 - C语言客户端

动态调用成员方法c++

如何导出 C# dll 方法/函数以在 C++ 中使用它 [重复]

C++类基础部分详解

从 .SO ( linux ) 导出 C++ 类