diff --git a/cpp/src/arrow/array.cc b/cpp/src/arrow/array.cc index 3ea033376fc..b25411a1c59 100644 --- a/cpp/src/arrow/array.cc +++ b/cpp/src/arrow/array.cc @@ -445,21 +445,21 @@ Status Array::Accept(ArrayVisitor* visitor) const { // ---------------------------------------------------------------------- // Instantiate templates -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; -template class NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; +template class ARROW_TEMPLATE_EXPORT NumericArray; } // namespace arrow diff --git a/cpp/src/arrow/array.h b/cpp/src/arrow/array.h index c0ec571e459..53b640853d5 100644 --- a/cpp/src/arrow/array.h +++ b/cpp/src/arrow/array.h @@ -483,34 +483,23 @@ class ARROW_EXPORT DictionaryArray : public Array { // ---------------------------------------------------------------------- // extern templates and other details -// gcc and clang disagree about how to handle template visibility when you have -// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815 -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wattributes" -#endif - // Only instantiate these templates once -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; -extern template class ARROW_EXPORT NumericArray; - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; +ARROW_EXTERN_TEMPLATE NumericArray; } // namespace arrow diff --git a/cpp/src/arrow/tensor.cc b/cpp/src/arrow/tensor.cc index 6489cd01d4c..7c4593fc40e 100644 --- a/cpp/src/arrow/tensor.cc +++ b/cpp/src/arrow/tensor.cc @@ -100,16 +100,16 @@ NumericTensor::NumericTensor(const std::shared_ptr& data, const std::vector& shape, const std::vector& strides) : NumericTensor(data, shape, strides, {}) {} -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; -template class NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; +template class ARROW_TEMPLATE_EXPORT NumericTensor; } // namespace arrow diff --git a/cpp/src/arrow/tensor.h b/cpp/src/arrow/tensor.h index 0059368f7b2..7bee867a9b3 100644 --- a/cpp/src/arrow/tensor.h +++ b/cpp/src/arrow/tensor.h @@ -129,29 +129,18 @@ class ARROW_EXPORT NumericTensor : public Tensor { // ---------------------------------------------------------------------- // extern templates and other details -// gcc and clang disagree about how to handle template visibility when you have -// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815 -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wattributes" -#endif - // Only instantiate these templates once -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; -extern template class ARROW_EXPORT NumericTensor; - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; +ARROW_EXTERN_TEMPLATE NumericTensor; } // namespace arrow diff --git a/cpp/src/arrow/type.h b/cpp/src/arrow/type.h index dc50ecd669c..2a73f6be934 100644 --- a/cpp/src/arrow/type.h +++ b/cpp/src/arrow/type.h @@ -439,7 +439,7 @@ struct ARROW_EXPORT UnionType : public NestedType { enum class DateUnit : char { DAY = 0, MILLI = 1 }; -struct DateType : public FixedWidthType { +struct ARROW_EXPORT DateType : public FixedWidthType { public: DateUnit unit; @@ -496,7 +496,7 @@ static inline std::ostream& operator<<(std::ostream& os, TimeUnit unit) { return os; } -struct TimeType : public FixedWidthType { +struct ARROW_EXPORT TimeType : public FixedWidthType { public: TimeUnit unit; diff --git a/cpp/src/arrow/util/visibility.h b/cpp/src/arrow/util/visibility.h index 4819a0061e7..6382f7f6318 100644 --- a/cpp/src/arrow/util/visibility.h +++ b/cpp/src/arrow/util/visibility.h @@ -35,4 +35,21 @@ #endif #endif // Non-Windows +// gcc and clang disagree about how to handle template visibility when you have +// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815 + +#if defined(__clang__) + #define ARROW_EXTERN_TEMPLATE extern template class ARROW_EXPORT +#else + #define ARROW_EXTERN_TEMPLATE extern template class +#endif + +// This is a complicated topic, some reading on it: +// http://www.codesynthesis.com/~boris/blog/2010/01/18/dll-export-cxx-templates/ +#if defined(_MSC_VER) + #define ARROW_TEMPLATE_EXPORT ARROW_EXPORT +#else + #define ARROW_TEMPLATE_EXPORT +#endif + #endif // ARROW_UTIL_VISIBILITY_H