【问题标题】:How to make CMake's FindJava get 64 bit Java with a 32 bit Visual Studio generator如何使用 32 位 Visual Studio 生成器使 CMake 的 FindJava 获得 64 位 Java
【发布时间】:2020-02-03 23:28:57
【问题描述】:

我应用 CMake 来生成 Visual Studio 2017 解决方案,以便在 Windows 10 上构建 32 位应用程序。为了创建构建系统,我让 CMake 调用一些 Java 工具来生成一些要编译的代码(应用 Eclipse Modeling框架)。为了找到 Java 本身,我在 find_package(Java) 调用中应用了 CMake finder 模块 FindJava

我观察到FindJava 在这种情况下会自动选择 32 位版本的 Java,尽管也可以使用 64 位 Java。请注意,当我调用 CMake 为 Visual Studio 2017 x64 生成时,FindJava 返回 64 位 Java。因此,Java 版本似乎取决于使用的生成器的位数。

我的问题是,32 位 Java 有时无法分配足够的堆内存来执行代码生成工具。

为避免这种情况,我希望FindJava 始终找到独立于 Visual Studio 生成器位数的 64 位 Java。

我怎样才能做到这一点?

我目前使用 CMake 3.14,但如果有帮助可以更新。

编辑

我忘了提到我实现了许多开发人员在他们的机器上使用的 CMake 构建系统。所以我不希望在构建机器上假设 32 位和 64 位 Java 安装的固定路径。

【问题讨论】:

    标签: java cmake 64-bit 32-bit


    【解决方案1】:

    也许您可以尝试在 CMake 中设置环境变量 JAVA_HOME。但是,您需要强制开发人员相应地设置他们的环境。

    if(NOT DEFINED ENV{JAVA_HOME_64}) 
        message(FATAL_ERROR "This build requires setting your JAVA_HOME_64 environment variable to your 64 bit version of Java.")
    endif()
    
    set(ENV{JAVA_HOME} "$ENV{JAVA_HOME_64}")
    

    在 CMakeLists 中设置环境变量不会影响项目外部的环境变量。根据FindJava Documentation,这应该可以按预期工作。

    【讨论】:

    • 谢谢,我也想到了。但问题是,我为许多用户(开发人员)实现了构建系统,我不确定他们的 Java 安装是否都具有相同的路径。因此,为了安全起见,我更喜欢一种独立于系统的find_package 选项。抱歉,我应该提到这一点。
    • 在这种情况下,我认为我们受限于 Java 的实际实现。默认情况下,它总是引用 JAVA_HOME,我能想到的唯一方法是强制设置一个名为 JAVA_HOME_64 的环境变量,并在文件开头分配set(ENV{JAVA_HOME} "$ENV{JAVA_HOME_64}")。您还可以使用 if(NOT DEFINED ENV{JAVA_HOME_64}) message(FATAL_ERROR "This build requires setting your JAVA_HOME_64 environment variable to your 64 bit version of Java.") 保护 CMake
    • 是的,也许这可能是一个解决方案,尽管我总是尽量避免让开发人员采取任何额外的步骤。
    【解决方案2】:

    分析FindJava.cmake的代码显示目前无法按要求手动选择Java位数。

    我已经为此提交了更改请求:https://gitlab.kitware.com/cmake/cmake/issues/20306

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 2011-09-04
      • 2011-01-30
      • 2012-08-23
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多