Fix symbol visibility on Linux when compiling with -fvisibility=hidden (#1535)

Make FMT_API symbols use the default visibility on non-Windows
platforms. Otherwise, one cannot use the generated fmt library when
compiling globally with -fvisibility=hidden.

Fixes compile errors like:

```
../3rdParty/fmt/include/fmt/core.h:757: error: undefined reference to 'fmt::v6::internal::assert_fail(char const*, int, char const*)'
```

Note that the symbol exists, but is local:

```
$ nm -C libfmtd.so.6.1.3  | grep assert_fail
                 U __assert_fail
0000000000233ffa t fmt::v6::internal::assert_fail(char const*, int, char const*)
```

With this patch, the compile error is gone and the symbol is properly
exported:

```
$ nm -a bin/libfmtd.so -C | grep assert_fail
                 U __assert_fail
00000000002366ba T fmt::v6::internal::assert_fail(char const*, int, char const*)
```

Change-Id: I96054e622d9a2ae81907e1b01a1033e629767a91
This commit is contained in:
Milian Wolff 2020-01-30 15:26:18 +01:00 committed by GitHub
parent f499b393d1
commit 314e15001f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -185,11 +185,20 @@
# define FMT_CLASS_API # define FMT_CLASS_API
#endif #endif
#ifndef FMT_API #ifndef FMT_API
# define FMT_API # if FMT_GCC_VERSION || FMT_CLANG_VERSION
# define FMT_API __attribute__((visibility("default")))
# define FMT_EXTERN_TEMPLATE_API FMT_API
# define FMT_INSTANTIATION_DEF_API
# else
# define FMT_API
# endif
#endif #endif
#ifndef FMT_EXTERN_TEMPLATE_API #ifndef FMT_EXTERN_TEMPLATE_API
# define FMT_EXTERN_TEMPLATE_API # define FMT_EXTERN_TEMPLATE_API
#endif #endif
#ifndef FMT_INSTANTIATION_DEF_API
# define FMT_INSTANTIATION_DEF_API FMT_API
#endif
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
# define FMT_EXTERN extern # define FMT_EXTERN extern

View File

@ -121,7 +121,7 @@ template FMT_API char* internal::sprintf_format(long double,
internal::buffer<char>&, internal::buffer<char>&,
sprintf_specs); sprintf_specs);
template struct FMT_API internal::basic_data<void>; template struct FMT_INSTANTIATION_DEF_API internal::basic_data<void>;
// Workaround a bug in MSVC2013 that prevents instantiation of format_float. // Workaround a bug in MSVC2013 that prevents instantiation of format_float.
int (*instantiate_format_float)(double, int, internal::float_specs, int (*instantiate_format_float)(double, int, internal::float_specs,