从Julia调用C++ Hello World

xienkqul  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(138)

我有一个C++程序,它解析一个二进制文件并输出一个std::string。我想直接从Julia调用这个函数,并将steam转换为DataFrame。我需要它在Linux和Windows中工作。目前,我让程序将输出写入一个文本文件,然后将其读入Julia。Cxx不再受支持,试图让CxxWrap工作一直是一个令人沮丧的练习。
玩具问题:如果有人能告诉我如何从Julia调用下面的代码,那就太棒了。

// the example from https://github.com/JuliaInterop/CxxWrap.jl
#include <string>
std::string greet()
{
 return "hello, world";
}
kcugc4gi

kcugc4gi1#

虽然这是一个旧的线程,我昨天刚刚进行了这个练习,所以我在这里分享我的解决方案。这在Linux系统上的Julia/1.8.4、cmake/3.11.1和gcc/12.1.0上进行了测试。

第0步

我用CxxWrap.jl。首先,我必须在its github instructions之后创建一个libcxxwrap_julia_jll JLL库。完成后,我得到了一个新文件夹~/.julia/dev/libcxxwrap_julia_jll/override

第一步

创建hello.cpp文件:

#include <string>
#include "jlcxx/jlcxx.hpp"

std::string greet()
{
   return "hello, world";
}

JLCXX_MODULE define_julia_module(jlcxx::Module& mod)
{
  mod.method("greet", &greet);
}

CMakeLists.txt文件

project(HelloWorld)

cmake_minimum_required(VERSION 3.5)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

find_package(JlCxx)
get_target_property(JlCxx_location JlCxx::cxxwrap_julia LOCATION)
get_filename_component(JlCxx_location ${JlCxx_location} DIRECTORY)
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${JlCxx_location}")

message(STATUS "Found JlCxx at ${JlCxx_location}")

add_library(hello SHARED hello.cpp)

target_link_libraries(hello JlCxx::cxxwrap_julia)

install(TARGETS
  hello
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION lib)

它们位于同一目录中。

第二步

通过以下方式构建共享库(.io)文件:

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=your_path_to/libcxxwrap_julia_jll/override your_path_to_src
cmake --build . --config Release

其中your_path_to_src是包含hello.cppCMakeList.txt的目录。

步骤三

在Julia中调用Hello World:

# Load the module and generate the functions
module CppHello
using CxxWrap
@wrapmodule("your_path_to/build/lib/libhello")

function __init__()
    @initcxx
end
end

# Call greet and show the result
CppHello.greet() # prints "hello, world"

显然,所有这些信息都存在于CxxWrap.jl的README文件中。我只是在这里更详细地阐述了一下。

iqjalb3h

iqjalb3h2#

这里有一个新的包可能适合您的需求:
https://github.com/eschnett/CxxInterface.jl
它是作为Cxx.jl的继任者,而且更稳定,所以我建议早点给它,尽管我自己还没有试过!

相关问题