如何将类的对象文件与源文件链接

How to link an Object file of class with a source file

本文关键字:文件 源文件 链接 对象      更新时间:2023-10-16

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

就像在Java中一样,我可以给一个朋友一个编译好的*.class文件和那个类的文档而不给源代码,他可以根据需要包括那个类而不知道真正的源代码。

我可以用c++做同样的事情吗?和How ?

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

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

在c++中,您可以生成一个可执行文件(windows中的.exe, Linux中通常没有扩展名)或库文件(。Lib或.a)或共享库(.dll或.so)取决于您想要实现的目标。

如果你要提供一个库,你还必须提供一个带有类声明的头文件。如果你不想透露太多细节,你可以在头文件中有一个"实现"类,它只是一个指向实现的指针,而真正的实现只能作为源代码的所有者提供给你。

要了解更多信息,您应该查找Thomas Matthews建议的"PIMPL"-这是"指针实现类"的缩写。基本上,您的"公共"类只是一个外壳,提供您希望其他人看到的函数,其中的实现类完成所有艰苦的工作。

简单例子

头文件:

// 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();
}

现在您无法看到实现类包含什么或它是如何工作的-当然,这是一个非常微不足道的例子,但我希望它能传达思想。

你可以给它们*.class,但是它们可以被反编译。

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

您可以将类编译成库或dll或共享库并送给您的朋友。

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

参见PIMPL习语

是的,您可以提供编译后的目标文件和文档,其他人可以将。o(或。obj)文件链接到他们的代码中。如何做到这一点的具体细节因编译器和开发环境而异。如果您正在使用g++,只需使用以下命令行:

g++ -c source.cpp

这将创建一个。o文件,然后您(或任何人)可以使用

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

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

对于大量的函数和/或类,应该考虑创建一个库文件。它们可以是静态链接或动态链接。如果您想了解如何创建自己的库文件,我建议您在网上搜索更多信息。