Apache OpenDAL™ C++ Binding
June 17, 2026 · View on GitHub
A C++ binding for OpenDAL, providing access to S3, GCS, Azure Blob, HDFS, the local filesystem, and 50+ more services through one API.
Note: This binding is experimental/WIP. Only Clang and AppleClang are currently supported. The API may change without notice.
Note: This binding has its own independent version number. When checking compatibility, refer to this binding's version, not the Rust core version.
Useful Links
- User guide: opendal.apache.org/docs/bindings/cpp
- Services & configuration: opendal.apache.org/services
- Source:
bindings/cpp/ - Examples:
examples/cpp/
Integration via CMake
FetchContent
include(FetchContent)
FetchContent_Declare(
opendal-cpp
GIT_REPOSITORY https://github.com/apache/opendal.git
GIT_TAG v0.40.0
SOURCE_SUBDIR bindings/cpp
)
FetchContent_MakeAvailable(opendal-cpp)
target_link_libraries(your_target opendal_cpp)
Vendored source
mkdir third_party && cd third_party
git clone https://github.com/apache/opendal.git
cd opendal && git checkout v0.40.0
add_subdirectory(third_party/opendal/bindings/cpp)
target_link_libraries(your_target opendal_cpp)
Prerequisites
- CMake ≥ 3.22
- Clang or AppleClang with C++17 support (C++20 required for async)
Build
mkdir build && cd build
cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
make
CMake options
| Option | Default | Description |
|---|---|---|
OPENDAL_DEV | OFF | Enable all development options at once |
OPENDAL_FEATURES | "" | Comma-separated list of services, e.g. "opendal/services-s3" |
OPENDAL_ENABLE_ASYNC | OFF | Enable async API (requires C++20) |
OPENDAL_ENABLE_TESTING | OFF | Build and enable tests |
OPENDAL_ENABLE_DOCUMENTATION | OFF | Build Doxygen docs |
OPENDAL_ENABLE_ADDRESS_SANITIZER | OFF | Enable address sanitizer |
Example
#include "opendal.hpp"
#include <iostream>
int main() {
// Construct an operator. The second argument is a config map.
opendal::Operator op("memory");
// Write, read, stat.
op.Write("hello.txt", "Hello, OpenDAL!");
std::string data = op.Read("hello.txt");
std::cout << data << "\n";
opendal::Metadata meta = op.Stat("hello.txt");
std::cout << "size=" << meta.ContentLength() << "\n";
}
See the user guide for more examples including streaming reads, directory listing, real backends, and the async API.
Contributing
See CONTRIBUTING.md at the repository root.
License and Trademarks
Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
Apache OpenDAL, OpenDAL, and Apache are either registered trademarks or trademarks of the Apache Software Foundation.