【问题标题】:Dynamic linking in C/C++ (dll) vs JAVA (JAR)C/C++ (dll) 与 JAVA (JAR) 中的动态链接
【发布时间】:2016-04-15 12:05:40
【问题描述】:

我是 Java 编程新手。

基本上,当我们从事 c/c++ 编程时,我们使用 .h 和 .c 文件创建 dll 文件,其中 .h 文件包含声明,而 .c 文件包含这些类、函数的定义。 当我们想在其他项目中使用创建的 .dll 文件的这些功能时,我们在预处理器声明中包含 .h 以告诉编译器有关变量、函数的声明,并且我们在编译期间提供相应的 dll 文件路径,以便在链接器阶段它与 dll 通信.

这是我的问题,因为它不包含任何头文件,所以他们如何在 java 编程中管理它。它只有 .java 文件,这些文件被组合并创建 JAR 文件。当我想在另一个项目中使用这个 jar 文件时,我们使用“package”或“import”关键字但是当它说导入总文件将被导入逻辑和链接器在编译阶段如何管理??

【问题讨论】:

  • 对于 C/C++,您完全错了:链接器根本不关心 DLL。它需要一个导入库 (LIB) 来解析符号。不过,Java 的答案非常简单:所有类型信息都包含在 JAR 文件中,类似于 .NET 程序集。
  • jar 是压缩包,类似zip,你可以从中提取java类文件。
  • @KerrekSB 我猜,我已经用我的密码做到了。 o_O

标签: java c++ dll dynamic-linking


【解决方案1】:

他们如何在 java 编程中管理这个,因为它不包含任何头文件。

它通过将编译类和运行时(可能还有调试)所需的所有信息放在.class 文件中来管理这一点,因此不需要额外的信息。

源代码和 javadoc 通常也放在 JAR 中(有时是同一个 JAR)

当我想在另一个项目中使用这个 jar 文件时,我们使用“package”或“import”关键字

您不必这样做。这只是一个短手。您可以使用完整的package.ClassName,不需要import。注意:这不会导入任何代码或数据,只是允许您为类使用较短的名称。

例如没有区别

java.util.Date date = new java.util.Date();

import java.util.Date;

Date date = new Date(); // don't need to specify the full package name.

当它说导入总文件将按逻辑导入时

没有办法,也没有必要这样做。例如,没有像 #include 这样的东西,内联只发生在运行时,而不是编译时(编译时已知的常量除外)

链接器在编译阶段如何管理

到本机代码的链接和编译是在运行时执行的。 javac 编译器所做的只是检查代码的有效性并生成字节码供 JVM 读取。

【讨论】:

    【解决方案2】:
    1. 现代语言,Java(&C#)不区分声明和定义,所以在这些语言中没有.H文件的概念。

    2. 在许多方面(新语言),编译时与运行时的二元性丢失了(主要是因为它们具有强反射)。 Java 类或 JAR(或 C# 程序集)具有编译所需的信息(类似声明)。 Java 环境不需要特殊的“编译文件”。同一个 JAR 是“编译文件”和“运行时二进制 dll”

    带有 .H、.C、.LIB 文件的典型 C 思维进入了小众市场(恕我直言 - 我是老 C 程序员,我对新语言感觉很好)

    【讨论】:

      猜你喜欢
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      相关资源
      最近更新 更多