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

Java 如何将类的对象文件与源文件链接,java,c++,mingw32,Java,C++,Mingw32,我想知道我是否可以用类的对象文件链接并编译源代码文件,而不包括类源文件 或 就像在Java中一样,我可以给朋友一个编译过的*.class文件和该类的文档,而不需要提供源代码,他可以根据自己的需要包含该类,而不需要知道真正的源代码 我能用C++做精确的事情吗?怎么做 仅供参考:我正在使用MinGW 我是新手,所以这看起来像是一个愚蠢的问题(但仍然没有愚蠢的问题)。你可以给他们*.class,但他们可以反编译 大多数库都是使用类和生成的Javadoc提供的。您可以将类编译成库、dll或共享库,然后交

我想知道我是否可以用类的对象文件链接并编译源代码文件,而不包括类源文件

就像在Java中一样,我可以给朋友一个编译过的*.class文件和该类的文档,而不需要提供源代码,他可以根据自己的需要包含该类,而不需要知道真正的源代码

我能用C++做精确的事情吗?怎么做

仅供参考:我正在使用MinGW


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

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


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

您可以将类编译成库、dll或共享库,然后交给您的朋友

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


参见piml习惯用法。

C++中,你可以根据你想要达到的目标生成一个可执行文件(在Windows中,通常是在Linux中没有扩展)或者一个库文件(.LIB或.a)或一个共享的LyBARARY(.DLL或.so)。p> 如果您要提供一个库,那么还必须提供一个包含类声明的头文件。如果你不想透露太多细节,你可以有一个“implementation”类,它只是头文件中实现的一个指针,而真正的实现只能作为源代码的所有者提供给你

有关更多信息,您应该按照Thomas Matthews的建议查找“PIMPL”——这是“指向实现类的指针”的缩写。基本上,您的“public”类只是一个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();
}

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

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

g++ -c source.cpp
这将创建一个.o文件,然后您(或任何其他人)可以使用该文件与其他.o文件链接

g++ main.o source.o
其他编译器也有类似的选项。有关如何创建对象文件的说明,请阅读帮助文件和其他文档


对于大量函数和/或类,您应该考虑创建库文件。这些可以静态或动态链接。我建议你在网上搜索更多的信息,如果你想知道如何创建自己的库文件。< /P>有没有办法给他们一些东西,让他们可以使用但不见源代码用C++?C++更难逆向工程,但不是不可能的。阻止访问代码的唯一方法是通过服务在他们的behave上运行代码。好的,谢谢,但即使可以反向工程,我如何才能给他们编译的二进制文件?我更担心的是一些有效的东西。Java中最简单的方法是创建一个jar。Maven做这件事非常简单。你可以添加一个混淆器来让代码更难分解。类似C++的东西?我如何创建一个实现类?在java语言中,你所描述的是一个接口。在C++中,只需在类中声明纯虚函数,就可以完成完全相同的事情。不需要icky指针。对,所以接口不是PIMPL-接口提供了一个没有实现的类,您的代码可以通过一些“工厂”函数拥有指向该类的指针。pimpl是一个“complet”类,但实际实现是隐藏的。是的,差别不是很大,但是有差别。