JuliaHub Blog: Insights & Updates

Bridging Julia and C++ with CxxWrap.jl

Written by Sanjeeb Das Gupta | Feb 21, 2025

The Julia programming language is gaining traction as a powerful tool for modeling and simulation due to its speed, ease of use, and dynamic nature. However, many legacy simulation libraries are written in C++, a language known for its efficiency and extensive ecosystem. The challenge arises when trying to integrate high-performance C++-based simulation tools into Julia workflows.

This is where CxxWrap.jl comes into play.

CxxWrap.jl provides an efficient and seamless way to interface C++ simulation libraries with Julia, making it easier for engineers and researchers to leverage existing C++ models without rewriting entire systems. Moreover, Julia-based platforms like JuliaSim benefit from such interoperability, enabling users to combine Julia's dynamic simulation capabilities with robust C++ models.

Why Use CxxWrap.jl for Modeling & Simulation?

1. Leverage Existing C++ Simulation Code

Many industries, including aerospace, automotive, pharmaceuticals, and energy, rely on C++-based simulation tools. Rewriting these libraries in Julia would be costly and time-consuming. Instead, CxxWrap.jl allows direct integration of C++ libraries, preserving the original high-performance code while making it accessible from Julia.

2. Boost Performance with C++ and Julia Combined

Julia is designed for high-performance numerical computing, but C++ is still the standard for low-level computational efficiency. By using CxxWrap.jl, engineers can leverage C++’s computational power while benefiting from Julia's superior expressiveness and rapid prototyping.

3. Seamless Interoperability

Unlike other C++ binding solutions, CxxWrap.jl provides:

  • Automatic type conversion between Julia and C++.
  • Simple wrapper creation, reducing the complexity of interfacing.

Efficient memory management, ensuring smooth interaction between Julia’s garbage collection and C++’s manual memory management.

Using CxxWrap.jl: A Practical Example

To demonstrate the power of CxxWrap.jl, let’s consider a simple mechanical system simulation where we integrate a C++ physics engine with Julia.

Step 1: Create a C++ Library

We define a basic C++ class for a mass-spring system:

#include <cmath>
#include <jlcxx/jlcxx.hpp>

class MassSpringSystem {
public:
MassSpringSystem(double mass, double stiffness) : m(mass), k(stiffness) {}

double compute_displacement(double force) {
return force / k;
}

private:
double m, k;
};

JLCXX_MODULE define_julia_module(jlcxx::Module& mod) {
mod.add_type<MassSpringSystem>("MassSpringSystem")
.constructor<double, double>()
.method("compute_displacement", &MassSpringSystem::compute_displacement);
}


Step 2: Compile as a Shared Library

Using CMake or Make, compile the C++ code into a shared library (e.g., libmassspring.so).

Step 3: Load the C++ Library in Julia

Now, in Julia, we use CxxWrap.jl to load and interact with the C++ simulation model.

using CxxWrap

lib_path() = "path/to/libmassspring"
@wrapmodule lib_path

mass_spring = MassSpringSystem(5.0, 100.0)
force = 50.0
displacement = compute_displacement(mass_spring, force)
println("Displacement: ", displacement)

 

How CxxWrap.jl Supports JuliaSim 

JuliaSim, an industry-leading AI-enhanced modeling and simulation platform, is built on Julia’s high-performance computing capabilities. CxxWrap.jl enables JuliaSim by allowing it to interface with existing C++ models, making it easier for engineers to:

  • Import legacy simulation models.
  • Optimize and extend existing C++-based physics engines.
  • Leverage Julia's parallel computing and machine learning capabilities to enhance C++ models.

With JuliaSim and CxxWrap.jl, researchers and engineers can bridge the gap between legacy simulation software and cutting-edge AI-driven modeling, ensuring that businesses continue to innovate without discarding valuable existing models.

Conclusion

CxxWrap.jl is a valuable tool for the modeling and simulation community. By allowing seamless C++ and Julia integration, it empowers engineers and researchers to:

  • Preserve and utilize existing C++ simulation code.
  • Enhance performance by combining C++ efficiency with Julia's high-level capabilities.
  • Integrate JuliaSim with C++ models, enabling a future-ready simulation environment.

If you're working in engineering simulations, control systems, or AI-driven modeling, it's time to explore CxxWrap.jl and see how Julia can accelerate your workflows.

Ready to supercharge your simulation models? Try JuliaSim and integrate your C++ libraries today!