You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows下将ruby.h链接到C++ CMake项目

Windows下C++/CMake项目调用Ruby C API的解决方案

一、修复CMake找不到Ruby的问题

CMake的FindRuby模块在Windows环境下经常因为Ruby安装路径的特殊性(不同发行版路径结构差异)无法自动识别完整依赖路径,即便它能检测到版本。解决这个问题最直接的方式是手动指定Ruby的头文件和库路径:

1. RubyInstaller安装的情况

如果你用的是官方RubyInstaller(比如Ruby 3.1.3 x64),找到你的安装目录(默认是C:\Ruby31-x64),然后在CMakeLists.txt中添加以下配置:

# 替换为你的Ruby实际安装路径
set(RUBY_ROOT "C:/Ruby31-x64")
# 头文件路径,注意对应Ruby版本和架构
set(RUBY_INCLUDE_DIR "${RUBY_ROOT}/include/ruby-3.1.0/x64-msvcrt")
# 链接库文件
set(RUBY_LIBRARY "${RUBY_ROOT}/lib/x64-msvcrt-ruby310.lib")

# 添加头文件搜索路径
include_directories(${RUBY_INCLUDE_DIR})
include_directories("${RUBY_ROOT}/include/ruby-3.1.0")

# 链接Ruby库到目标
target_link_libraries(你的项目名称 PRIVATE ${RUBY_LIBRARY})

2. MSYS2/MINGW安装的情况

如果是通过MSYS2包管理器安装的Ruby(比如mingw-w64-x86_64-ruby),先确保包已安装,然后配置:

set(RUBY_INCLUDE_DIR "/mingw64/include/ruby-3.1.0/x86_64-linux")
set(RUBY_LIBRARY "/mingw64/lib/libruby.so")

include_directories(${RUBY_INCLUDE_DIR})
target_link_libraries(你的项目名称 PRIVATE ${RUBY_LIBRARY})

3. 命令行指定路径

也可以在执行cmake命令时直接传入参数,避免修改CMakeLists.txt:

cmake .. -DRuby_INCLUDE_DIR=C:/Ruby31-x64/include/ruby-3.1.0/x64-msvcrt -DRuby_LIBRARY=C:/Ruby31-x64/lib/x64-msvcrt-ruby310.lib

二、Ruby C API的替代方案

如果觉得Ruby C API的配置过于繁琐,可以考虑以下两种更易用的替代方案:

  • mruby:轻量级Ruby嵌入式实现,体积小巧,编译后可直接静态链接到项目中,无需依赖系统安装的Ruby,兼容性更好。
  • SWIG:自动生成C++与Ruby之间的绑定代码,只需定义接口文件,SWIG会处理底层API调用逻辑,减少手动编写绑定代码的工作量。

三、完整配置示例

这里提供一个可直接参考的最小项目配置:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(RubyCppEmbedDemo)

# 配置Ruby路径
set(RUBY_ROOT "C:/Ruby31-x64")
set(RUBY_INCLUDE_DIR "${RUBY_ROOT}/include/ruby-3.1.0/x64-msvcrt")
set(RUBY_LIBRARY "${RUBY_ROOT}/lib/x64-msvcrt-ruby310.lib")

# 添加头文件路径
include_directories(${RUBY_INCLUDE_DIR})
include_directories("${RUBY_ROOT}/include/ruby-3.1.0")

# 生成可执行文件
add_executable(RubyCppEmbedDemo main.cpp)

# 链接Ruby库
target_link_libraries(RubyCppEmbedDemo PRIVATE ${RUBY_LIBRARY})

main.cpp

#include <ruby.h>

int main() {
    // 初始化Ruby虚拟机
    ruby_init();
    // 执行Ruby代码
    rb_eval_string("puts 'Hello from embedded Ruby!'");
    // 清理Ruby虚拟机
    ruby_finalize();
    return 0;
}

内容的提问来源于stack exchange,提问作者amcastro4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:53:27