Xplatcppwindowsdll Updated Official
find_package(xplatcpp 3.0 REQUIRED) xplatcpp_windows_dll( TARGET MyEngine SOURCES engine.cpp PRIVATE_DEFINES _CRT_SECURE_NO_WARNINGS PUBLIC_DEFINES MYENGINE_EXPORTS WINDOWS_VERSIONINFO on LOAD_TIME_PROFILING off # optional, enable for debugging ) The new explicit TARGET and WINDOWS_VERSIONINFO parameters prevent ambiguous parsing. Replace your own export macros with #include <xplatcpp/api.h> and tag public classes/functions with XPLATCPP_PUBLIC .
Clean your build directory and re-configure:
Set CMAKE_MSVC_RUNTIME_LIBRARY consistently across all projects. 🔴 Pitfall 2: C++ Exceptions Crossing DLL Boundaries Throwing an exception from a DLL and catching it in the main executable is unsafe if they aren’t compiled with the same compiler and EH flags. The updated toolchain optionally wraps all public functions with a std::error_code facade. xplatcppwindowsdll updated
In this article, we’ll dissect what xplatcppwindowsdll is, why the new update matters, and how you can leverage its features to build faster, safer, and truly cross-platform C++ binaries for Windows environments. For the uninitiated, xplatcppwindowsdll is a specialized build toolchain and library template designed to simplify the creation of Windows Dynamic Link Libraries (DLLs) from a single, cross-platform C++ codebase.
#include <xplatcpp/api.h> class XPLATCPP_PUBLIC MyClass ... ; find_package(xplatcpp 3
The updated module automatically generates a .def file for MSVC, ensuring that even C++ mangled names are correctly exported without needing extern "C" wrappers. The update adds native integration with Windows side-by-side (SxS) assemblies . You can now annotate your cross-platform CMakeLists.txt with version ranges:
// vcpkg.json "dependencies": [ "xplatcppwindowsdll", // version >=3.0.0 ] The function signature for add_xplatcpp_dll has changed to xplatcpp_windows_dll . Here’s a migration diff: 🔴 Pitfall 2: C++ Exceptions Crossing DLL Boundaries
#ifdef _WIN32 #ifdef MYLIB_EXPORTS #define MYLIB_API __declspec(dllexport) #else #define MYLIB_API __declspec(dllimport) #endif #else #define MYLIB_API __attribute__((visibility("default"))) #endif class MYLIB_API MyClass ... ;