diff --git a/cpp/README.md b/cpp/README.md index a986e72cad..d0f625f733 100644 --- a/cpp/README.md +++ b/cpp/README.md @@ -86,6 +86,22 @@ following dependencies: If your project does not need `lz4` or `zstd` support, you can optionally disable these by defining `MCAP_COMPRESSION_NO_LZ4` or `MCAP_COMPRESSION_NO_ZSTD` respectively. +The C++ implementation of MCAP can also be compiled into a static or shared library. +When compiling for Windows, the correct `dllexport` and `dllimport` storage-class attributes need to be set. +This is handled in [mcap/visibility.hpp](https://github.com/foxglove/mcap/blob/main/cpp/mcap/include/mcap/visibility.hpp). + +There are two `#defines` that need (not) to be set depending on whether using MCAP as static or shared library and whether we are compiling the MCAP library itself or linking against it: + +| Static library | `MCAP_IMPLEMENTATION` | `MCAP_STATIC_DEFINE` | +| -------------- | -------------------- | -------------------- | +| Compiling | Set | Set | +| Link against | Not set | Set | + +| Shared library | `MCAP_IMPLEMENTATION` | `MCAP_STATIC_DEFINE` | +| -------------- | -------------------- | -------------------- | +| Compiling | Set | Not set | +| Link against | Not set | Not set | + ### Conan To simplify installation of dependencies, the [Conan](https://conan.io/) package diff --git a/cpp/mcap/include/mcap/visibility.hpp b/cpp/mcap/include/mcap/visibility.hpp index bf709ef1d1..60a2ff5ce2 100644 --- a/cpp/mcap/include/mcap/visibility.hpp +++ b/cpp/mcap/include/mcap/visibility.hpp @@ -1,17 +1,21 @@ #pragma once #if defined _WIN32 || defined __CYGWIN__ -# ifdef __GNUC__ -# define MCAP_EXPORT __attribute__((dllexport)) -# define MCAP_IMPORT __attribute__((dllimport)) +# ifndef MCAP_STATIC_DEFINE +# ifdef __GNUC__ +# define MCAP_EXPORT __attribute__((dllexport)) +# define MCAP_IMPORT __attribute__((dllimport)) +# else +# define MCAP_EXPORT __declspec(dllexport) +# define MCAP_IMPORT __declspec(dllimport) +# endif +# ifdef MCAP_IMPLEMENTATION +# define MCAP_PUBLIC MCAP_EXPORT +# else +# define MCAP_PUBLIC MCAP_IMPORT +# endif # else -# define MCAP_EXPORT __declspec(dllexport) -# define MCAP_IMPORT __declspec(dllimport) -# endif -# ifdef MCAP_IMPLEMENTATION -# define MCAP_PUBLIC MCAP_EXPORT -# else -# define MCAP_PUBLIC MCAP_IMPORT +# define MCAP_PUBLIC # endif #else # define MCAP_EXPORT __attribute__((visibility("default")))