-
Notifications
You must be signed in to change notification settings - Fork 1k
Description
Is your feature request related to a problem?
Buildings a shared library on Windows will results in a DLL without symbols, since MSVC always hides symbols and cpr has no explicit symbol visibility markers. See also mesonbuild/wrapdb#2436. Unfortunately, MSVC can't be teached to make all symbols public by default, so this is something which needs to be fixed in the project.
Possible Solution
Functions and classes which are part of the public ABI should have a symbol visibility marker.
This requires the following definitions
#if defined _WIN32 || defined __CYGWIN__
#define CPR_DLL_EXPORT __declspec(dllexport)
#define CPR_DLL_IMPORT __declspec(dllimport)
#define CPR_DLL_LOCAL
#else
#define CPR_DLL_EXPORT [[gnu::visibility("default")]]
#define CPR_DLL_IMPORT [[gnu::visibility("default")]]
#define CPR_DLL_LOCAL [[gnu::visibility("hidden")]]
#endif
#ifndef CPR_STATIC
#ifdef CPR_BUILDLIB
#define CPR_PUBLIC CPR_DLL_EXPORT
#define CPR_PRIVATE CPR_DLL_LOCAL
#else
#define CPR_PUBLIC CPR_DLL_IMPORT
#define CPR_PRIVATE CPR_DLL_LOCAL
#endif
#else
#define CPR_PUBLIC
#define CPR_PRIVATE
#endifDuring building CPR_BUILDLIB needs to be defined, and if a static library is built, CPR_STATIC needs to be defined as well. For usage, CPR_STATIC needs to be defined if the static library is linked, otherwise no definitions are required.
This code snippet introduces two macros:
CPR_PUBLICfor the public APICPR_PRIVATEto explicitly hide a symbol
In practice this looks something like:
CPR_PUBLIC void some_public_function();
class CPR_PUBLIC some_class {
public:
void some_public_function();
private:
CPR_PRIVATE void some_function_only_used_in_cpp();
private:
int some_member;
};One advantage of doing this is that this can reduce the size of the shared library since it now only exports the symbols which are actually part of the public API (requires -fvisibility=hidden on GCC & clang).
Alternatives
Only support static library builds on Windows.