From 030e9fe3b700b0a720f91d02dbbe4936007a282e Mon Sep 17 00:00:00 2001 From: Simon Wright Date: Mon, 2 Sep 2024 07:26:07 +0200 Subject: [PATCH 1/2] cpp: support building and linking against mcap library statically on Windows --- cpp/mcap/include/mcap/visibility.hpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) 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"))) From db769ad5692ab50db244261a69198344ce42b741 Mon Sep 17 00:00:00 2001 From: Simon Wright Date: Mon, 25 Nov 2024 11:03:01 +0100 Subject: [PATCH 2/2] cpp: update README on how to build/link against MCAP static/shared library --- cpp/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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