如何将类的Object文件与源文件链接

时间:2013-01-13 19:18:26

标签: java c++ mingw32

我想知道我是否可以使用类的目标文件链接和编译源代码文件,而不包括类源文件。

或者

就像在Java中一样,我可以将编译的* .class文件提供给朋友和该类的文档而不提供源代码,并且他可以在不知道真实来源的情况下将该类包含在他的需要中。

我可以用C ++做一些事吗?怎么样?

仅供参考:我正在使用MinGW。

我很新,所以这可能看起来像一个愚蠢的问题(但仍然没有愚蠢的问题)。

4 个答案:

答案 0 :(得分:1)

在C ++中你可以生成一个可执行文件(Windows中的.exe,Linux中通常没有扩展名)或库文件(.lib或.a)或共享库(.dll或.so),具体取决于你想要实现。

如果您要提供库,则必须提供包含类声明的头文件。如果您不想过多地提供有关详细信息,可以使用“实现”类,它只是指向头文件中实现的指针,并且实际实现仅作为所有者可用。源。

有关更多信息,您应该像Thomas Matthews所建议的那样查找“PIMPL” - 这是“指向IMPLementation类的指针”的缩写。基本上,你的“公共”类只是一个提供你希望别人看到的函数的shell,而它里面的实现类可以完成所有的工作。

简单示例

在您的标头文件中:

// Forward declaration of the implementation class. 
class double_it_impl;

// Class that stores an integer, and doubles it each time you 
// call doubling().
class Public_double_it
{
  public:
    public_double_it(int x);    // COnstructor. 

    int doubling();        // Function d

  private:
     double_it_impl *pImpl;
};

在源文件或私有头文件中,我们声明实际的实现:

class double_it_impl
{
  public:
    double_it_impl(int x) : m_x = x; {};
    int doubling()  { m_x *= 2; return m_x; }

}


public_double_it::public_double_it(int x)
{
    pImpl = new public_double_it(x);
}

int public_double_it::doubling()
{
   return pImpl->doubling();
}

现在你看不到实现类包含的内容或它是如何工作的 - 当然,这是一个非常简单的例子,但我希望它传达了这个想法。

答案 1 :(得分:0)

你可以给他们* .class,但他们可以反编译。

大多数库都是使用类和生成的Javadoc提供的。

答案 2 :(得分:0)

您可以将该类编译为库或dll或共享库,并将其提供给您的朋友。

他们需要一个定义接口的头文件。

另见PIMPL习语。

答案 3 :(得分:0)

是的,您可以提供编译的目标文件和文档,其他人可以将.o(或.obj)文件链接到其代码中。有关如何执行此操作的具体细节因编译器和开发环境而异。如果您使用的是g ++,只需使用以下命令行:

g++ -c source.cpp

这将创建一个.o文件,您(或其他任何人)可以使用

与其他.o文件链接
g++ main.o source.o

其他编译器也有类似的选择。有关如何创建目标文件的说明,请阅读帮助文件和其他文档。

对于大量函数和/或类,您应该查看创建库文件。这些可以静态或动态链接。如果您想了解如何创建自己的库文件,我建议您在Web上搜索更多信息。