0

我想知道我是否可以在不包括类源文件的情况下将源代码文件与类的目标文件链接和编译。

或者

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

我可以用 C++ 做确切的事情吗?如何 ?

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

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

4

4 回答 4

1

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

如果您要提供库,则还必须提供带有类声明的头文件。如果你不想透露太多细节,你可以有一个“实现”类,它只是一个指向头文件中实现的指针,真正的实现只有你作为所有者才能使用来源。

有关更多信息,您应该按照 Thomas Matthews 的建议查找“PIMPL”——它是“指向 IMPlementation 类的指针”的缩写。基本上,您的“公共”类只是一个提供您希望其他人看到的功能的外壳,其中的实现类完成了所有艰苦的工作。

简单的例子

在你的头文件中:

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

现在你看不到实现类包含什么或它是如何工作的——当然,这是一个非常琐碎的例子,但我希望它传达了这个想法。

于 2013-01-13T19:54:37.230 回答
0

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

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

于 2013-01-13T19:24:50.637 回答
0

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

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

另见 PIMPL 成语。

于 2013-01-13T19:52:50.543 回答
0

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

g++ -c source.cpp

这将创建一个 .o 文件,然后您(或其他任何人)可以将其与其他 .o 文件链接

g++ main.o source.o

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

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

于 2013-01-13T20:01:47.200 回答