changeset 29228:5c14f81e0937

Set API tags in files in liboctave/numeric (patch #8919). Add API tag to template class definitions. Add API tag to (un-defined) functions and member functions in headers. Export template class instantiations and template functions from .cc files.
author Markus Mützel <markus.muetzel@gmx.de>
date Tue, 29 Dec 2020 17:51:23 +0100
parents a009cb8ef68f
children ed5eacd5c3ed
files liboctave/numeric/ODES.h liboctave/numeric/aepbalance.cc liboctave/numeric/aepbalance.h liboctave/numeric/chol.cc liboctave/numeric/chol.h liboctave/numeric/eigs-base.cc liboctave/numeric/eigs-base.h liboctave/numeric/gepbalance.cc liboctave/numeric/gepbalance.h liboctave/numeric/gsvd.h liboctave/numeric/hess.cc liboctave/numeric/hess.h liboctave/numeric/lo-blas-proto.h liboctave/numeric/lu.cc liboctave/numeric/lu.h liboctave/numeric/oct-rand.cc liboctave/numeric/oct-rand.h liboctave/numeric/qr.cc liboctave/numeric/qr.h liboctave/numeric/qrp.cc liboctave/numeric/qrp.h liboctave/numeric/randgamma.cc liboctave/numeric/randgamma.h liboctave/numeric/randmtzig.cc liboctave/numeric/randmtzig.h liboctave/numeric/randpoisson.cc liboctave/numeric/randpoisson.h liboctave/numeric/schur.cc liboctave/numeric/schur.h liboctave/numeric/sparse-chol.cc liboctave/numeric/sparse-chol.h liboctave/numeric/sparse-dmsolve.cc liboctave/numeric/sparse-dmsolve.h liboctave/numeric/sparse-lu.cc liboctave/numeric/sparse-lu.h liboctave/numeric/sparse-qr.cc liboctave/numeric/sparse-qr.h liboctave/numeric/svd.cc liboctave/numeric/svd.h
diffstat 39 files changed, 400 insertions(+), 370 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/numeric/ODES.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/ODES.h	Tue Dec 29 17:51:23 2020 +0100
@@ -67,10 +67,10 @@
 
   ColumnVector parameter_vector (void) { return theta; }
 
-  void initialize (const ColumnVector& x, double t);
+  OCTAVE_API void initialize (const ColumnVector& x, double t);
 
-  void initialize (const ColumnVector& x, double t,
-                   const ColumnVector& theta);
+  OCTAVE_API void
+  initialize (const ColumnVector& x, double t, const ColumnVector& theta);
 
 protected:
 
--- a/liboctave/numeric/aepbalance.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/aepbalance.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -48,6 +48,7 @@
   namespace math
   {
     template <>
+    OCTAVE_API
     aepbalance<Matrix>::aepbalance (const Matrix& a, bool noperm, bool noscal)
       : balanced_mat (a), scale (), ilo (), ihi (),
         job (get_job (noperm, noscal))
@@ -72,7 +73,7 @@
     }
 
     template <>
-    Matrix
+    OCTAVE_API Matrix
     aepbalance<Matrix>::balancing_matrix (void) const
     {
       F77_INT n = to_f77_int (balanced_mat.rows ());
@@ -98,6 +99,7 @@
     }
 
     template <>
+    OCTAVE_API
     aepbalance<FloatMatrix>::aepbalance (const FloatMatrix& a, bool noperm,
                                          bool noscal)
       : balanced_mat (a), scale (), ilo (), ihi (),
@@ -123,7 +125,7 @@
     }
 
     template <>
-    FloatMatrix
+    OCTAVE_API FloatMatrix
     aepbalance<FloatMatrix>::balancing_matrix (void) const
     {
       F77_INT n = to_f77_int (balanced_mat.rows ());
@@ -149,6 +151,7 @@
     }
 
     template <>
+    OCTAVE_API
     aepbalance<ComplexMatrix>::aepbalance (const ComplexMatrix& a, bool noperm,
                                            bool noscal)
       : balanced_mat (a), scale (), ilo (), ihi (),
@@ -174,7 +177,7 @@
     }
 
     template <>
-    ComplexMatrix
+    OCTAVE_API ComplexMatrix
     aepbalance<ComplexMatrix>::balancing_matrix (void) const
     {
       F77_INT n = to_f77_int (balanced_mat.rows ());
@@ -201,6 +204,7 @@
     }
 
     template <>
+    OCTAVE_API
     aepbalance<FloatComplexMatrix>::aepbalance (const FloatComplexMatrix& a,
                                                 bool noperm, bool noscal)
       : balanced_mat (a), scale (), ilo (), ihi (),
@@ -226,7 +230,7 @@
     }
 
     template <>
-    FloatComplexMatrix
+    OCTAVE_API FloatComplexMatrix
     aepbalance<FloatComplexMatrix>::balancing_matrix (void) const
     {
       F77_INT n = to_f77_int (balanced_mat.rows ());
--- a/liboctave/numeric/aepbalance.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/aepbalance.h	Tue Dec 29 17:51:23 2020 +0100
@@ -35,7 +35,8 @@
   namespace math
   {
     template <typename MT>
-    class aepbalance
+    class
+    aepbalance
     {
     public:
 
@@ -43,7 +44,7 @@
 
       aepbalance (void) : balanced_mat (), scale (), ilo (), ihi (), job () { }
 
-      aepbalance (const MT& a, bool noperm = false, bool noscal = false);
+      OCTAVE_API aepbalance (const MT& a, bool noperm = false, bool noscal = false);
 
       aepbalance (const aepbalance& a)
         : balanced_mat (a.balanced_mat), scale (a.scale),
@@ -66,7 +67,7 @@
 
       virtual ~aepbalance (void) = default;
 
-      MT balancing_matrix (void) const;
+      OCTAVE_API MT balancing_matrix (void) const;
 
       MT balanced_matrix (void) const
       {
--- a/liboctave/numeric/chol.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/chol.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -406,7 +406,7 @@
     // Specializations.
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<Matrix>::init (const Matrix& a, bool upper, bool calc_cond)
     {
       octave_idx_type a_nr = a.rows ();
@@ -481,7 +481,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     chol<Matrix>::update (const ColumnVector& u)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -498,7 +498,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<Matrix>::downdate (const ColumnVector& u)
     {
       F77_INT info = -1;
@@ -519,7 +519,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<Matrix>::insert_sym (const ColumnVector& u, octave_idx_type j_arg)
     {
       F77_INT info = -1;
@@ -546,7 +546,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<Matrix>::delete_sym (octave_idx_type j_arg)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -563,7 +563,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<Matrix>::shift_sym (octave_idx_type i_arg, octave_idx_type j_arg)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -582,7 +582,7 @@
 #endif
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<FloatMatrix>::init (const FloatMatrix& a, bool upper, bool calc_cond)
     {
       octave_idx_type a_nr = a.rows ();
@@ -657,7 +657,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     chol<FloatMatrix>::update (const FloatColumnVector& u)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -674,7 +674,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<FloatMatrix>::downdate (const FloatColumnVector& u)
     {
       F77_INT info = -1;
@@ -695,7 +695,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<FloatMatrix>::insert_sym (const FloatColumnVector& u,
                                    octave_idx_type j_arg)
     {
@@ -723,7 +723,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<FloatMatrix>::delete_sym (octave_idx_type j_arg)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -741,7 +741,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<FloatMatrix>::shift_sym (octave_idx_type i_arg, octave_idx_type j_arg)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -760,7 +760,7 @@
 #endif
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<ComplexMatrix>::init (const ComplexMatrix& a, bool upper, bool calc_cond)
     {
       octave_idx_type a_nr = a.rows ();
@@ -834,7 +834,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     chol<ComplexMatrix>::update (const ComplexColumnVector& u)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -854,7 +854,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<ComplexMatrix>::downdate (const ComplexColumnVector& u)
     {
       F77_INT info = -1;
@@ -878,7 +878,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<ComplexMatrix>::insert_sym (const ComplexColumnVector& u,
                                      octave_idx_type j_arg)
     {
@@ -909,7 +909,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<ComplexMatrix>::delete_sym (octave_idx_type j_arg)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -928,7 +928,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<ComplexMatrix>::shift_sym (octave_idx_type i_arg,
                                     octave_idx_type j_arg)
     {
@@ -951,7 +951,7 @@
 #endif
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<FloatComplexMatrix>::init (const FloatComplexMatrix& a, bool upper,
                                     bool calc_cond)
     {
@@ -1026,7 +1026,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     chol<FloatComplexMatrix>::update (const FloatComplexColumnVector& u)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -1043,7 +1043,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<FloatComplexMatrix>::downdate (const FloatComplexColumnVector& u)
     {
       F77_INT info = -1;
@@ -1065,7 +1065,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     chol<FloatComplexMatrix>::insert_sym (const FloatComplexColumnVector& u,
                                           octave_idx_type j_arg)
     {
@@ -1095,7 +1095,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<FloatComplexMatrix>::delete_sym (octave_idx_type j_arg)
     {
       F77_INT n = to_f77_int (chol_mat.rows ());
@@ -1113,7 +1113,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     chol<FloatComplexMatrix>::shift_sym (octave_idx_type i_arg,
                                          octave_idx_type j_arg)
     {
@@ -1143,16 +1143,16 @@
 
     template class chol<FloatComplexMatrix>;
 
-    template Matrix
+    template OCTAVE_API Matrix
     chol2inv<Matrix> (const Matrix& r);
 
-    template ComplexMatrix
+    template OCTAVE_API ComplexMatrix
     chol2inv<ComplexMatrix> (const ComplexMatrix& r);
 
-    template FloatMatrix
+    template OCTAVE_API FloatMatrix
     chol2inv<FloatMatrix> (const FloatMatrix& r);
 
-    template FloatComplexMatrix
+    template OCTAVE_API FloatComplexMatrix
     chol2inv<FloatComplexMatrix> (const FloatComplexMatrix& r);
   }
 }
--- a/liboctave/numeric/chol.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/chol.h	Tue Dec 29 17:51:23 2020 +0100
@@ -76,19 +76,19 @@
       COND_T rcond (void) const { return xrcond; }
 
       // Compute the inverse of a matrix using the Cholesky factorization.
-      T inverse (void) const;
+      OCTAVE_API T inverse (void) const;
 
-      void set (const T& R);
+      OCTAVE_API void set (const T& R);
 
-      void update (const VT& u);
+      OCTAVE_API void update (const VT& u);
 
-      octave_idx_type downdate (const VT& u);
+      OCTAVE_API octave_idx_type downdate (const VT& u);
 
-      octave_idx_type insert_sym (const VT& u, octave_idx_type j);
+      OCTAVE_API octave_idx_type insert_sym (const VT& u, octave_idx_type j);
 
-      void delete_sym (octave_idx_type j);
+      OCTAVE_API void delete_sym (octave_idx_type j);
 
-      void shift_sym (octave_idx_type i, octave_idx_type j);
+      OCTAVE_API void shift_sym (octave_idx_type i, octave_idx_type j);
 
     private:
 
@@ -98,11 +98,11 @@
 
       bool is_upper;
 
-      octave_idx_type init (const T& a, bool upper, bool calc_cond);
+      OCTAVE_API octave_idx_type init (const T& a, bool upper, bool calc_cond);
     };
 
     template <typename T>
-    T
+    OCTAVE_API T
     chol2inv (const T& r);
   }
 }
--- a/liboctave/numeric/eigs-base.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/eigs-base.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -3944,7 +3944,7 @@
 // Matrix
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricMatrix<Matrix>
   (const Matrix& m, const std::string typ, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, Matrix& eig_vec,
@@ -3953,7 +3953,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricMatrixShift<Matrix>
   (const Matrix& m, double sigma, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, Matrix& eig_vec,
@@ -3962,7 +3962,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricFunc<Matrix>
 (EigsFunc fun, octave_idx_type n, const std::string& _typ, double sigma,
    octave_idx_type k, octave_idx_type p, octave_idx_type& info,
@@ -3971,7 +3971,7 @@
    bool rvec, bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricMatrix<Matrix>
   (const Matrix& m, const std::string typ, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -3980,7 +3980,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricMatrixShift<Matrix>
   (const Matrix& m, double sigmar, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -3989,7 +3989,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricFunc<Matrix>
 (EigsFunc fun, octave_idx_type n, const std::string& _typ, double sigmar,
    octave_idx_type k, octave_idx_type p, octave_idx_type& info,
@@ -4000,7 +4000,7 @@
 // SparseMatrix
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricMatrix<SparseMatrix>
   (const SparseMatrix& m, const std::string typ, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, Matrix& eig_vec,
@@ -4009,7 +4009,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricMatrixShift<SparseMatrix>
   (const SparseMatrix& m, double sigma, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, Matrix& eig_vec,
@@ -4018,7 +4018,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricFunc<SparseMatrix>
 (EigsFunc fun, octave_idx_type n, const std::string& _typ, double sigma,
    octave_idx_type k, octave_idx_type p, octave_idx_type& info,
@@ -4027,7 +4027,7 @@
    bool rvec, bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricMatrix<SparseMatrix>
   (const SparseMatrix& m, const std::string typ, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -4036,7 +4036,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricMatrixShift<SparseMatrix>
   (const SparseMatrix& m, double sigmar, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -4045,7 +4045,7 @@
    bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricFunc<SparseMatrix>
 (EigsFunc fun, octave_idx_type n, const std::string& _typ, double sigmar,
    octave_idx_type k, octave_idx_type p, octave_idx_type& info,
@@ -4056,7 +4056,7 @@
 // ComplexMatrix
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricMatrix<ComplexMatrix>
   (const ComplexMatrix& m, const std::string typ, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -4065,7 +4065,7 @@
    bool rvec, bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricMatrixShift<ComplexMatrix>
   (const ComplexMatrix& m, Complex sigma, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -4074,7 +4074,7 @@
    bool rvec, bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricFunc<ComplexMatrix>
 (EigsComplexFunc fun, octave_idx_type n, const std::string& _typ, Complex sigma,
    octave_idx_type k, octave_idx_type p, octave_idx_type& info,
@@ -4085,7 +4085,7 @@
 // SparseComplexMatrix
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricMatrix<SparseComplexMatrix>
   (const SparseComplexMatrix& m, const std::string typ, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -4094,7 +4094,7 @@
    double tol, bool rvec, bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricMatrixShift<SparseComplexMatrix>
   (const SparseComplexMatrix& m, Complex sigma, octave_idx_type k,
    octave_idx_type p, octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -4103,7 +4103,7 @@
    double tol, bool rvec, bool cholB, int disp, int maxit);
 
 template
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricFunc<SparseComplexMatrix>
 (EigsComplexFunc fun, octave_idx_type n, const std::string& _typ, Complex sigma,
    octave_idx_type k, octave_idx_type p, octave_idx_type& info,
--- a/liboctave/numeric/eigs-base.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/eigs-base.h	Tue Dec 29 17:51:23 2020 +0100
@@ -44,7 +44,7 @@
                                                 int& eigs_error);
 
 template <typename M>
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricMatrix (const M& m, const std::string typ,
                          octave_idx_type k, octave_idx_type p,
                          octave_idx_type& info, Matrix& eig_vec,
@@ -54,7 +54,7 @@
                          bool cholB, int disp, int maxit);
 
 template <typename M>
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricMatrixShift (const M& m, double sigma,
                               octave_idx_type k, octave_idx_type p,
                               octave_idx_type& info, Matrix& eig_vec,
@@ -64,7 +64,7 @@
                               bool cholB, int disp, int maxit);
 
 template <typename M>
-extern OCTAVE_API octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealSymmetricFunc (EigsFunc fun, octave_idx_type n,
                        const std::string& _typ, double sigma,
                        octave_idx_type k, octave_idx_type p,
@@ -75,7 +75,7 @@
                        bool cholB, int disp, int maxit);
 
 template <typename M>
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricMatrix (const M& m, const std::string typ,
                             octave_idx_type k, octave_idx_type p,
                             octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -85,7 +85,7 @@
                             bool cholB, int disp, int maxit);
 
 template <typename M>
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricMatrixShift (const M& m, double sigmar,
                                  octave_idx_type k, octave_idx_type p,
                                  octave_idx_type& info,
@@ -96,7 +96,7 @@
                                  bool cholB, int disp, int maxit);
 
 template <typename M>
-extern OCTAVE_API octave_idx_type
+OCTAVE_API octave_idx_type
 EigsRealNonSymmetricFunc (EigsFunc fun, octave_idx_type n,
                           const std::string& _typ, double sigmar,
                           octave_idx_type k, octave_idx_type p,
@@ -107,7 +107,7 @@
                           bool cholB, int disp, int maxit);
 
 template <typename M>
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricMatrix (const M& m, const std::string typ,
                                octave_idx_type k, octave_idx_type p,
                                octave_idx_type& info, ComplexMatrix& eig_vec,
@@ -118,7 +118,7 @@
                                bool cholB, int disp, int maxit);
 
 template <typename M>
-octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricMatrixShift (const M& m, Complex sigma,
                                     octave_idx_type k, octave_idx_type p,
                                     octave_idx_type& info,
@@ -130,7 +130,7 @@
                                     bool cholB, int disp, int maxit);
 
 template <typename M>
-extern OCTAVE_API octave_idx_type
+OCTAVE_API octave_idx_type
 EigsComplexNonSymmetricFunc (EigsComplexFunc fun, octave_idx_type n,
                              const std::string& _typ, Complex sigma,
                              octave_idx_type k, octave_idx_type p,
--- a/liboctave/numeric/gepbalance.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/gepbalance.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -43,7 +43,7 @@
   namespace math
   {
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     gepbalance<Matrix>::init (const Matrix& a, const Matrix& b,
                               const std::string& balance_job)
     {
@@ -108,7 +108,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     gepbalance<FloatMatrix>::init (const FloatMatrix& a, const FloatMatrix& b,
                                    const std::string& balance_job)
     {
@@ -174,7 +174,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     gepbalance<ComplexMatrix>::init (const ComplexMatrix& a,
                                      const ComplexMatrix& b,
                                      const std::string& balance_job)
@@ -242,7 +242,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     gepbalance<FloatComplexMatrix>::init (const FloatComplexMatrix& a,
                                           const FloatComplexMatrix& b,
                                           const std::string& balance_job)
--- a/liboctave/numeric/gepbalance.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/gepbalance.h	Tue Dec 29 17:51:23 2020 +0100
@@ -87,7 +87,8 @@
       RT balancing_mat;
       RT balancing_mat2;
 
-      octave_idx_type init (const T& a, const T& b, const std::string& job);
+      OCTAVE_API octave_idx_type
+      init (const T& a, const T& b, const std::string& job);
     };
   }
 }
--- a/liboctave/numeric/gsvd.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/gsvd.h	Tue Dec 29 17:51:23 2020 +0100
@@ -34,6 +34,7 @@
   {
     template <typename T>
     class
+    OCTAVE_API
     gsvd
     {
     public:
--- a/liboctave/numeric/hess.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/hess.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -41,7 +41,7 @@
   namespace math
   {
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     hess<Matrix>::init (const Matrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -104,7 +104,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     hess<FloatMatrix>::init (const FloatMatrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -167,7 +167,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     hess<ComplexMatrix>::init (const ComplexMatrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -230,7 +230,7 @@
     }
 
     template <>
-    octave_idx_type
+    OCTAVE_API octave_idx_type
     hess<FloatComplexMatrix>::init (const FloatComplexMatrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
--- a/liboctave/numeric/hess.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/hess.h	Tue Dec 29 17:51:23 2020 +0100
@@ -82,11 +82,11 @@
       T hess_mat;
       T unitary_hess_mat;
 
-      octave_idx_type init (const T& a);
+      OCTAVE_API octave_idx_type init (const T& a);
     };
 
     template <typename T>
-    extern std::ostream&
+    extern OCTAVE_API std::ostream&
     operator << (std::ostream& os, const hess<T>& a);
   }
 }
--- a/liboctave/numeric/lo-blas-proto.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/lo-blas-proto.h	Tue Dec 29 17:51:23 2020 +0100
@@ -205,6 +205,7 @@
 
   // XERBLA
 
+  OCTAVE_API
   F77_RET_T
   F77_FUNC (xerbla, XERBLA) (F77_CONST_CHAR_ARG_DECL, const F77_INT&
                              F77_CHAR_ARG_LEN_DECL);
--- a/liboctave/numeric/lu.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/lu.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -270,6 +270,7 @@
     // Specializations.
 
     template <>
+    OCTAVE_API
     lu<Matrix>::lu (const Matrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -293,7 +294,7 @@
 #if defined (HAVE_QRUPDATE_LUU)
 
     template <>
-    void
+    OCTAVE_API void
     lu<Matrix>::update (const ColumnVector& u, const ColumnVector& v)
     {
       if (packed ())
@@ -319,7 +320,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<Matrix>::update (const Matrix& u, const Matrix& v)
     {
       if (packed ())
@@ -352,7 +353,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<Matrix>::update_piv (const ColumnVector& u, const ColumnVector& v)
     {
       if (packed ())
@@ -383,7 +384,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<Matrix>::update_piv (const Matrix& u, const Matrix& v)
     {
       if (packed ())
@@ -422,6 +423,7 @@
 #endif
 
     template <>
+    OCTAVE_API
     lu<FloatMatrix>::lu (const FloatMatrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -445,7 +447,7 @@
 #if defined (HAVE_QRUPDATE_LUU)
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatMatrix>::update (const FloatColumnVector& u,
                              const FloatColumnVector& v)
     {
@@ -473,7 +475,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatMatrix>::update (const FloatMatrix& u, const FloatMatrix& v)
     {
       if (packed ())
@@ -506,7 +508,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatMatrix>::update_piv (const FloatColumnVector& u,
                                  const FloatColumnVector& v)
     {
@@ -538,7 +540,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatMatrix>::update_piv (const FloatMatrix& u, const FloatMatrix& v)
     {
       if (packed ())
@@ -577,6 +579,7 @@
 #endif
 
     template <>
+    OCTAVE_API
     lu<ComplexMatrix>::lu (const ComplexMatrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -601,7 +604,7 @@
 #if defined (HAVE_QRUPDATE_LUU)
 
     template <>
-    void
+    OCTAVE_API void
     lu<ComplexMatrix>::update (const ComplexColumnVector& u,
                                const ComplexColumnVector& v)
     {
@@ -630,7 +633,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<ComplexMatrix>::update (const ComplexMatrix& u, const ComplexMatrix& v)
     {
       if (packed ())
@@ -666,7 +669,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<ComplexMatrix>::update_piv (const ComplexColumnVector& u,
                                    const ComplexColumnVector& v)
     {
@@ -700,7 +703,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<ComplexMatrix>::update_piv (const ComplexMatrix& u,
                                    const ComplexMatrix& v)
     {
@@ -744,6 +747,7 @@
 #endif
 
     template <>
+    OCTAVE_API
     lu<FloatComplexMatrix>::lu (const FloatComplexMatrix& a)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -768,7 +772,7 @@
 #if defined (HAVE_QRUPDATE_LUU)
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatComplexMatrix>::update (const FloatComplexColumnVector& u,
                                     const FloatComplexColumnVector& v)
     {
@@ -797,7 +801,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatComplexMatrix>::update (const FloatComplexMatrix& u,
                                     const FloatComplexMatrix& v)
     {
@@ -832,7 +836,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatComplexMatrix>::update_piv (const FloatComplexColumnVector& u,
                                         const FloatComplexColumnVector& v)
     {
@@ -866,7 +870,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     lu<FloatComplexMatrix>::update_piv (const FloatComplexMatrix& u,
                                         const FloatComplexMatrix& v)
     {
--- a/liboctave/numeric/lu.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/lu.h	Tue Dec 29 17:51:23 2020 +0100
@@ -49,12 +49,12 @@
       lu (void)
         : a_fact (), l_fact (), ipvt () { }
 
-      lu (const T& a);
+      OCTAVE_API lu (const T& a);
 
       lu (const lu& a)
         : a_fact (a.a_fact), l_fact (a.l_fact), ipvt (a.ipvt) { }
 
-      lu (const T& l, const T& u, const PermMatrix& p);
+      OCTAVE_API lu (const T& l, const T& u, const PermMatrix& p);
 
       lu& operator = (const lu& a)
       {
@@ -70,35 +70,35 @@
 
       virtual ~lu (void) = default;
 
-      bool packed (void) const;
+      OCTAVE_API bool packed (void) const;
 
-      void unpack (void);
+      OCTAVE_API void unpack (void);
 
-      T L (void) const;
+      OCTAVE_API T L (void) const;
 
-      T U (void) const;
+      OCTAVE_API T U (void) const;
 
-      T Y (void) const;
+      OCTAVE_API T Y (void) const;
 
-      PermMatrix P (void) const;
+      OCTAVE_API PermMatrix P (void) const;
 
-      ColumnVector P_vec (void) const;
+      OCTAVE_API ColumnVector P_vec (void) const;
 
-      bool regular (void) const;
+      OCTAVE_API bool regular (void) const;
 
-      void update (const VT& u, const VT& v);
+      OCTAVE_API void update (const VT& u, const VT& v);
 
-      void update (const T& u, const T& v);
+      OCTAVE_API void update (const T& u, const T& v);
 
-      void update_piv (const VT& u, const VT& v);
+      OCTAVE_API void update_piv (const VT& u, const VT& v);
 
-      void update_piv (const T& u, const T& v);
+      OCTAVE_API void update_piv (const T& u, const T& v);
 
     protected:
 
       // The result of getp is passed to other Octave Matrix functions,
       // so we use octave_idx_type.
-      Array<octave_idx_type> getp (void) const;
+      OCTAVE_API Array<octave_idx_type> getp (void) const;
 
       T a_fact;
       T l_fact;
--- a/liboctave/numeric/oct-rand.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/oct-rand.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -291,7 +291,7 @@
   }
 
   template <>
-  double rand::uniform<double> (void)
+  OCTAVE_API double rand::uniform<double> (void)
   {
     double retval;
 
@@ -304,7 +304,7 @@
   }
 
   template <>
-  double rand::normal<double> (void)
+  OCTAVE_API double rand::normal<double> (void)
   {
     double retval;
 
@@ -317,7 +317,7 @@
   }
 
   template <>
-  double rand::exponential<double> (void)
+  OCTAVE_API double rand::exponential<double> (void)
   {
     double retval;
 
@@ -330,7 +330,7 @@
   }
 
   template <>
-  double rand::poisson<double> (double a)
+  OCTAVE_API double rand::poisson<double> (double a)
   {
     double retval;
 
@@ -352,7 +352,7 @@
   }
 
   template <>
-  double rand::gamma<double> (double a)
+  OCTAVE_API double rand::gamma<double> (double a)
   {
     double retval;
 
@@ -370,7 +370,7 @@
   }
 
   template <>
-  float rand::uniform<float> (void)
+  OCTAVE_API float rand::uniform<float> (void)
   {
     float retval;
 
@@ -383,7 +383,7 @@
   }
 
   template <>
-  float rand::normal<float> (void)
+  OCTAVE_API float rand::normal<float> (void)
   {
     float retval;
 
@@ -396,7 +396,7 @@
   }
 
   template <>
-  float rand::exponential<float> (void)
+  OCTAVE_API float rand::exponential<float> (void)
   {
     float retval;
 
@@ -409,7 +409,7 @@
   }
 
   template <>
-  float rand::poisson<float> (float a)
+  OCTAVE_API float rand::poisson<float> (float a)
   {
     float retval;
 
@@ -434,7 +434,7 @@
   }
 
   template <>
-  float rand::gamma<float> (float a)
+  OCTAVE_API float rand::gamma<float> (float a)
   {
     float retval;
 
@@ -490,8 +490,8 @@
     return retval;
   }
 
-  template double rand::do_scalar<double> (double);
-  template float rand::do_scalar<float> (float);
+  template OCTAVE_API double rand::do_scalar<double> (double);
+  template OCTAVE_API float rand::do_scalar<float> (float);
 
   template <typename T>
   Array<T>
@@ -511,8 +511,10 @@
     return retval;
   }
 
-  template Array<double> rand::do_vector<double> (octave_idx_type, double);
-  template Array<float> rand::do_vector<float> (octave_idx_type, float);
+  template OCTAVE_API Array<double>
+  rand::do_vector<double> (octave_idx_type, double);
+  template OCTAVE_API Array<float>
+  rand::do_vector<float> (octave_idx_type, float);
 
   NDArray rand::do_nd_array (const dim_vector& dims, double a)
   {
--- a/liboctave/numeric/oct-rand.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/oct-rand.h	Tue Dec 29 17:51:23 2020 +0100
@@ -45,7 +45,7 @@
   {
   protected:
 
-    rand (void);
+    OCTAVE_API rand (void);
 
   public:
 
@@ -207,86 +207,88 @@
     std::map<int, uint32NDArray> rand_states;
 
     // Return the current seed.
-    double do_seed (void);
+    OCTAVE_API double do_seed (void);
 
     // Set the seed.
-    void do_seed (double s);
+    OCTAVE_API void do_seed (double s);
 
     // Reset the seed.
-    void do_reset ();
+    OCTAVE_API void do_reset ();
 
     // Return the current state.
-    uint32NDArray do_state (const std::string& d);
+    OCTAVE_API uint32NDArray do_state (const std::string& d);
 
     // Set the current state/
-    void do_state (const uint32NDArray& s, const std::string& d);
+    OCTAVE_API void do_state (const uint32NDArray& s, const std::string& d);
 
     // Reset the current state/
-    void do_reset (const std::string& d);
+    OCTAVE_API void do_reset (const std::string& d);
 
     // Return the current distribution.
-    std::string do_distribution (void);
+    OCTAVE_API std::string do_distribution (void);
 
     // Set the current distribution.  May be either "uniform" (the
     // default), "normal", "exponential", "poisson", or "gamma".
-    void do_distribution (const std::string& d);
+    OCTAVE_API void do_distribution (const std::string& d);
 
-    void do_uniform_distribution (void);
+    OCTAVE_API void do_uniform_distribution (void);
 
-    void do_normal_distribution (void);
+    OCTAVE_API void do_normal_distribution (void);
 
-    void do_exponential_distribution (void);
+    OCTAVE_API void do_exponential_distribution (void);
 
-    void do_poisson_distribution (void);
+    OCTAVE_API void do_poisson_distribution (void);
 
-    void do_gamma_distribution (void);
+    OCTAVE_API void do_gamma_distribution (void);
 
     // The following templates only make sense for double and float
     // types.
 
-    template <typename T> T uniform (void);
+    template <typename T> OCTAVE_API T uniform (void);
 
-    template <typename T> T normal (void);
+    template <typename T> OCTAVE_API T normal (void);
 
-    template <typename T> T exponential (void);
+    template <typename T> OCTAVE_API T exponential (void);
 
-    template <typename T> T poisson (T a);
+    template <typename T> OCTAVE_API T poisson (T a);
 
-    template <typename T> T gamma (T a);
+    template <typename T> OCTAVE_API T gamma (T a);
 
     // Return the next number from the sequence.
-    template <typename T> T do_scalar (T a = 1);
+    template <typename T> OCTAVE_API T do_scalar (T a = 1);
 
     // Return an array of numbers from the sequence.
-    template <typename T> Array<T> do_vector (octave_idx_type n, T a = 1);
+    template <typename T> OCTAVE_API Array<T>
+    do_vector (octave_idx_type n, T a = 1);
 
     // Return an N-dimensional array of numbers from the sequence,
     // filled in column major order.
-    NDArray do_nd_array (const dim_vector& dims, double a = 1.);
+    OCTAVE_API NDArray do_nd_array (const dim_vector& dims, double a = 1.);
 
     // Return an N-dimensional array of numbers from the sequence,
     // filled in column major order.
-    FloatNDArray do_float_nd_array (const dim_vector& dims, float a = 1.);
+    OCTAVE_API FloatNDArray
+    do_float_nd_array (const dim_vector& dims, float a = 1.);
 
     // Some helper functions.
 
-    void initialize_ranlib_generators (void);
+    OCTAVE_API void initialize_ranlib_generators (void);
 
-    void initialize_mersenne_twister (void);
+    OCTAVE_API void initialize_mersenne_twister (void);
 
-    uint32NDArray get_internal_state (void);
+    OCTAVE_API uint32NDArray get_internal_state (void);
 
-    void save_state (void);
+    OCTAVE_API void save_state (void);
 
-    int get_dist_id (const std::string& d);
+    OCTAVE_API int get_dist_id (const std::string& d);
 
-    void set_internal_state (const uint32NDArray& s);
+    OCTAVE_API void set_internal_state (const uint32NDArray& s);
 
-    void switch_to_generator (int dist);
+    OCTAVE_API void switch_to_generator (int dist);
 
-    void fill (octave_idx_type len, double *v, double a);
+    OCTAVE_API void fill (octave_idx_type len, double *v, double a);
 
-    void fill (octave_idx_type len, float *v, float a);
+    OCTAVE_API void fill (octave_idx_type len, float *v, float a);
   };
 }
 
--- a/liboctave/numeric/qr.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/qr.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -378,7 +378,7 @@
     // Specializations.
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::form (octave_idx_type n_arg, Matrix& afact, double *tau,
                       type qr_type)
     {
@@ -449,7 +449,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::init (const Matrix& a, type qr_type)
     {
       F77_INT m = to_f77_int (a.rows ());
@@ -485,7 +485,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::update (const ColumnVector& u, const ColumnVector& v)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -507,7 +507,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::update (const Matrix& u, const Matrix& v)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -535,7 +535,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::insert_col (const ColumnVector& u, octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -571,7 +571,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::insert_col (const Matrix& u, const Array<octave_idx_type>& j)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -629,7 +629,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::delete_col (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -658,7 +658,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::delete_col (const Array<octave_idx_type>& j)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -708,7 +708,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::insert_row (const RowVector& u, octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -740,7 +740,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::delete_row (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -766,7 +766,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<Matrix>::shift_cols (octave_idx_type i_arg, octave_idx_type j_arg)
     {
       F77_INT i = to_f77_int (i_arg);
@@ -792,7 +792,7 @@
 #endif
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::form (octave_idx_type n_arg, FloatMatrix& afact,
                            float *tau, type qr_type)
     {
@@ -863,7 +863,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::init (const FloatMatrix& a, type qr_type)
     {
       F77_INT m = to_f77_int (a.rows ());
@@ -899,7 +899,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::update (const FloatColumnVector& u, const FloatColumnVector& v)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -921,7 +921,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::update (const FloatMatrix& u, const FloatMatrix& v)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -949,7 +949,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::insert_col (const FloatColumnVector& u,
                                  octave_idx_type j_arg)
     {
@@ -986,7 +986,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::insert_col (const FloatMatrix& u,
                                  const Array<octave_idx_type>& j)
     {
@@ -1045,7 +1045,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::delete_col (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -1074,7 +1074,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::delete_col (const Array<octave_idx_type>& j)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -1124,7 +1124,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::insert_row (const FloatRowVector& u,
                                  octave_idx_type j_arg)
     {
@@ -1157,7 +1157,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::delete_row (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -1184,7 +1184,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatMatrix>::shift_cols (octave_idx_type i_arg, octave_idx_type j_arg)
     {
       F77_INT i = to_f77_int (i_arg);
@@ -1210,7 +1210,7 @@
 #endif
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::form (octave_idx_type n_arg, ComplexMatrix& afact,
                              Complex *tau, type qr_type)
     {
@@ -1287,7 +1287,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::init (const ComplexMatrix& a, type qr_type)
     {
       F77_INT m = to_f77_int (a.rows ());
@@ -1327,7 +1327,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::update (const ComplexColumnVector& u,
                                const ComplexColumnVector& v)
     {
@@ -1353,7 +1353,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::update (const ComplexMatrix& u, const ComplexMatrix& v)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -1385,7 +1385,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::insert_col (const ComplexColumnVector& u,
                                    octave_idx_type j_arg)
     {
@@ -1423,7 +1423,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::insert_col (const ComplexMatrix& u,
                                    const Array<octave_idx_type>& j)
     {
@@ -1485,7 +1485,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::delete_col (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -1515,7 +1515,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::delete_col (const Array<octave_idx_type>& j)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -1566,7 +1566,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::insert_row (const ComplexRowVector& u,
                                    octave_idx_type j_arg)
     {
@@ -1600,7 +1600,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::delete_row (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -1628,7 +1628,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<ComplexMatrix>::shift_cols (octave_idx_type i_arg,
                                    octave_idx_type j_arg)
     {
@@ -1656,7 +1656,7 @@
 #endif
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::form (octave_idx_type n_arg, FloatComplexMatrix& afact,
                                   FloatComplex *tau, type qr_type)
     {
@@ -1731,7 +1731,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::init (const FloatComplexMatrix& a, type qr_type)
     {
       F77_INT m = to_f77_int (a.rows ());
@@ -1769,7 +1769,7 @@
 #if defined (HAVE_QRUPDATE)
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::update (const FloatComplexColumnVector& u,
                                     const FloatComplexColumnVector& v)
     {
@@ -1795,7 +1795,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::update (const FloatComplexMatrix& u,
                                     const FloatComplexMatrix& v)
     {
@@ -1827,7 +1827,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::insert_col (const FloatComplexColumnVector& u,
                                         octave_idx_type j_arg)
     {
@@ -1864,7 +1864,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::insert_col (const FloatComplexMatrix& u,
                                         const Array<octave_idx_type>& j)
     {
@@ -1924,7 +1924,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::delete_col (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -1954,7 +1954,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::delete_col (const Array<octave_idx_type>& j)
     {
       F77_INT m = to_f77_int (q.rows ());
@@ -2004,7 +2004,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::insert_row (const FloatComplexRowVector& u,
                                         octave_idx_type j_arg)
     {
@@ -2038,7 +2038,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::delete_row (octave_idx_type j_arg)
     {
       F77_INT j = to_f77_int (j_arg);
@@ -2066,7 +2066,7 @@
     }
 
     template <>
-    void
+    OCTAVE_API void
     qr<FloatComplexMatrix>::shift_cols (octave_idx_type i_arg,
                                         octave_idx_type j_arg)
     {
--- a/liboctave/numeric/qr.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/qr.h	Tue Dec 29 17:51:23 2020 +0100
@@ -59,7 +59,7 @@
         init (a, qr_type);
       }
 
-      qr (const T& q, const T& r);
+      OCTAVE_API qr (const T& q, const T& r);
 
       qr (const qr& a) : q (a.q), r (a.r) { }
 
@@ -80,39 +80,40 @@
 
       T R (void) const { return r; }
 
-      type get_type (void) const;
+      OCTAVE_API type get_type (void) const;
 
-      bool regular (void) const;
+      OCTAVE_API bool regular (void) const;
 
-      void init (const T& a, type qr_type);
+      OCTAVE_API void init (const T& a, type qr_type);
 
-      void update (const CV_T& u, const CV_T& v);
+      OCTAVE_API void update (const CV_T& u, const CV_T& v);
 
-      void update (const T& u, const T& v);
+      OCTAVE_API void update (const T& u, const T& v);
 
-      void insert_col (const CV_T& u, octave_idx_type j);
+      OCTAVE_API void insert_col (const CV_T& u, octave_idx_type j);
 
-      void insert_col (const T& u, const Array<octave_idx_type>& j);
+      OCTAVE_API void insert_col (const T& u, const Array<octave_idx_type>& j);
 
-      void delete_col (octave_idx_type j);
+      OCTAVE_API void delete_col (octave_idx_type j);
 
-      void delete_col (const Array<octave_idx_type>& j);
+      OCTAVE_API void delete_col (const Array<octave_idx_type>& j);
 
-      void insert_row (const RV_T& u, octave_idx_type j);
+      OCTAVE_API void insert_row (const RV_T& u, octave_idx_type j);
 
-      void delete_row (octave_idx_type j);
+      OCTAVE_API void delete_row (octave_idx_type j);
 
-      void shift_cols (octave_idx_type i, octave_idx_type j);
+      OCTAVE_API void shift_cols (octave_idx_type i, octave_idx_type j);
 
     protected:
 
       T q;
       T r;
 
-      void form (octave_idx_type n, T& afact, ELT_T *tau, type qr_type);
+      OCTAVE_API void
+      form (octave_idx_type n, T& afact, ELT_T *tau, type qr_type);
     };
 
-    extern void warn_qrupdate_once (void);
+    extern OCTAVE_API void warn_qrupdate_once (void);
   }
 }
 
--- a/liboctave/numeric/qrp.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/qrp.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -50,6 +50,7 @@
     // Specialization.
 
     template <>
+    OCTAVE_API
     void
     qrp<Matrix>::init (const Matrix& a, type qr_type)
     {
@@ -102,6 +103,7 @@
     }
 
     template <>
+    OCTAVE_API
     qrp<Matrix>::qrp (const Matrix& a, type qr_type)
       : qr<Matrix> (), p ()
     {
@@ -109,6 +111,7 @@
     }
 
     template <>
+    OCTAVE_API
     RowVector
     qrp<Matrix>::Pvec (void) const
     {
@@ -118,6 +121,7 @@
     }
 
     template <>
+    OCTAVE_API
     void
     qrp<FloatMatrix>::init (const FloatMatrix& a, type qr_type)
     {
@@ -170,6 +174,7 @@
     }
 
     template <>
+    OCTAVE_API
     qrp<FloatMatrix>::qrp (const FloatMatrix& a, type qr_type)
       : qr<FloatMatrix> (), p ()
     {
@@ -177,6 +182,7 @@
     }
 
     template <>
+    OCTAVE_API
     FloatRowVector
     qrp<FloatMatrix>::Pvec (void) const
     {
@@ -186,6 +192,7 @@
     }
 
     template <>
+    OCTAVE_API
     void
     qrp<ComplexMatrix>::init (const ComplexMatrix& a, type qr_type)
     {
@@ -246,6 +253,7 @@
     }
 
     template <>
+    OCTAVE_API
     qrp<ComplexMatrix>::qrp (const ComplexMatrix& a, type qr_type)
       : qr<ComplexMatrix> (), p ()
     {
@@ -253,6 +261,7 @@
     }
 
     template <>
+    OCTAVE_API
     RowVector
     qrp<ComplexMatrix>::Pvec (void) const
     {
@@ -262,6 +271,7 @@
     }
 
     template <>
+    OCTAVE_API
     void
     qrp<FloatComplexMatrix>::init (const FloatComplexMatrix& a, type qr_type)
     {
@@ -322,6 +332,7 @@
     }
 
     template <>
+    OCTAVE_API
     qrp<FloatComplexMatrix>::qrp (const FloatComplexMatrix& a, type qr_type)
       : qr<FloatComplexMatrix> (), p ()
     {
@@ -329,6 +340,7 @@
     }
 
     template <>
+    OCTAVE_API
     FloatRowVector
     qrp<FloatComplexMatrix>::Pvec (void) const
     {
--- a/liboctave/numeric/qrp.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/qrp.h	Tue Dec 29 17:51:23 2020 +0100
@@ -47,7 +47,7 @@
 
       qrp (void) : qr<T> (), p () { }
 
-      qrp (const T&, type = qr<T>::std);
+      OCTAVE_API qrp (const T&, type = qr<T>::std);
 
       qrp (const qrp& a) : qr<T> (a), p (a.p) { }
 
@@ -64,11 +64,11 @@
 
       ~qrp (void) = default;
 
-      void init (const T&, type = qr<T>::std);
+      OCTAVE_API void init (const T&, type = qr<T>::std);
 
       PermMatrix P (void) const { return p; }
 
-      RV_T Pvec (void) const;
+      OCTAVE_API RV_T Pvec (void) const;
 
     private:
 
--- a/liboctave/numeric/randgamma.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/randgamma.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -131,6 +131,6 @@
       }
   }
 
-  template void rand_gamma (double, octave_idx_type, double *);
-  template void rand_gamma (float, octave_idx_type, float *);
+  template OCTAVE_API void rand_gamma (double, octave_idx_type, double *);
+  template OCTAVE_API void rand_gamma (float, octave_idx_type, float *);
 }
--- a/liboctave/numeric/randgamma.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/randgamma.h	Tue Dec 29 17:51:23 2020 +0100
@@ -34,7 +34,7 @@
 namespace octave
 {
   template <typename T>
-  void
+  OCTAVE_API void
   rand_gamma (T a, octave_idx_type n, T *p);
 
   template <typename T>
--- a/liboctave/numeric/randmtzig.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/randmtzig.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -426,7 +426,7 @@
 
   /* Determine mantissa for uniform doubles */
   template <>
-  double
+  OCTAVE_API double
   rand_uniform<double> (void)
   {
     return randu53 ();
@@ -434,7 +434,7 @@
 
   /* Determine mantissa for uniform floats */
   template <>
-  float
+  OCTAVE_API float
   rand_uniform<float> (void)
   {
     return randu24 ();
@@ -581,7 +581,7 @@
    */
 
 
-  template <> double rand_normal<double> (void)
+  template <> OCTAVE_API double rand_normal<double> (void)
   {
     if (initt)
       create_ziggurat_tables ();
@@ -645,7 +645,7 @@
       }
   }
 
-  template <> double rand_exponential<double> (void)
+  template <> OCTAVE_API double rand_exponential<double> (void)
   {
     if (initt)
       create_ziggurat_tables ();
@@ -671,17 +671,17 @@
       }
   }
 
-  template <> void rand_uniform<double> (octave_idx_type n, double *p)
+  template <> OCTAVE_API void rand_uniform<double> (octave_idx_type n, double *p)
   {
     std::generate_n (p, n, [](void) { return rand_uniform<double> (); });
   }
 
-  template <> void rand_normal (octave_idx_type n, double *p)
+  template <> OCTAVE_API void rand_normal (octave_idx_type n, double *p)
   {
     std::generate_n (p, n, [](void) { return rand_normal<double> (); });
   }
 
-  template <> void rand_exponential (octave_idx_type n, double *p)
+  template <> OCTAVE_API void rand_exponential (octave_idx_type n, double *p)
   {
     std::generate_n (p, n, [](void) { return rand_exponential<double> (); });
   }
@@ -783,7 +783,7 @@
    * distribution is exp(-0.5*x*x)
    */
 
-  template <> float rand_normal<float> (void)
+  template <> OCTAVE_API float rand_normal<float> (void)
   {
     if (inittf)
       create_ziggurat_float_tables ();
@@ -823,7 +823,7 @@
       }
   }
 
-  template <> float rand_exponential<float> (void)
+  template <> OCTAVE_API float rand_exponential<float> (void)
   {
     if (inittf)
       create_ziggurat_float_tables ();
@@ -849,17 +849,17 @@
       }
   }
 
-  template <> void rand_uniform (octave_idx_type n, float *p)
+  template <> OCTAVE_API void rand_uniform (octave_idx_type n, float *p)
   {
     std::generate_n (p, n, [](void) { return rand_uniform<float> (); });
   }
 
-  template <> void rand_normal (octave_idx_type n, float *p)
+  template <> OCTAVE_API void rand_normal (octave_idx_type n, float *p)
   {
     std::generate_n (p, n, [](void) { return rand_normal<float> (); });
   }
 
-  template <> void rand_exponential (octave_idx_type n, float *p)
+  template <> OCTAVE_API void rand_exponential (octave_idx_type n, float *p)
   {
     std::generate_n (p, n, [](void) { return rand_exponential<float> (); });
   }
--- a/liboctave/numeric/randmtzig.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/randmtzig.h	Tue Dec 29 17:51:23 2020 +0100
@@ -75,46 +75,47 @@
 {
   // Mersenne Twister.
 
-  extern void init_mersenne_twister (void);
-  extern void init_mersenne_twister (const uint32_t seed);
-  extern void init_mersenne_twister (const uint32_t *init_key,
-                                     const int key_length);
+  extern OCTAVE_API void init_mersenne_twister (void);
+  extern OCTAVE_API void init_mersenne_twister (const uint32_t seed);
+  extern OCTAVE_API void init_mersenne_twister (const uint32_t *init_key,
+                                                const int key_length);
 
-  extern void set_mersenne_twister_state (const uint32_t *save);
-  extern void get_mersenne_twister_state (uint32_t *save);
+  extern OCTAVE_API void set_mersenne_twister_state (const uint32_t *save);
+  extern OCTAVE_API void get_mersenne_twister_state (uint32_t *save);
 
-  template <typename T> T rand_uniform (void);
-  template <typename T> T rand_normal (void);
-  template <typename T> T rand_exponential (void);
+  template <typename T> OCTAVE_API T rand_uniform (void);
+  template <typename T> OCTAVE_API T rand_normal (void);
+  template <typename T> OCTAVE_API T rand_exponential (void);
 
-  template <typename T> void rand_uniform (octave_idx_type n, T *p);
-  template <typename T> void rand_normal (octave_idx_type n, T *p);
-  template <typename T> void rand_exponential (octave_idx_type n, T *p);
+  template <typename T> OCTAVE_API void rand_uniform (octave_idx_type n, T *p);
+  template <typename T> OCTAVE_API void rand_normal (octave_idx_type n, T *p);
+  template <typename T> OCTAVE_API void
+  rand_exponential (octave_idx_type n, T *p);
 
-  template <> double rand_uniform<double> (void);
-  template <> double rand_normal<double> (void);
-  template <> double rand_exponential<double> (void);
+  template <> OCTAVE_API double rand_uniform<double> (void);
+  template <> OCTAVE_API double rand_normal<double> (void);
+  template <> OCTAVE_API double rand_exponential<double> (void);
 
-  template <> float rand_uniform<float> (void);
-  template <> float rand_normal<float> (void);
-  template <> float rand_exponential<float> (void);
+  template <> OCTAVE_API float rand_uniform<float> (void);
+  template <> OCTAVE_API float rand_normal<float> (void);
+  template <> OCTAVE_API float rand_exponential<float> (void);
 
-  template <> void
+  template <> OCTAVE_API void
   rand_uniform<double> (octave_idx_type n, double *p);
 
-  template <> void
+  template <> OCTAVE_API void
   rand_normal<double> (octave_idx_type n, double *p);
 
-  template <> void
+  template <> OCTAVE_API void
   rand_exponential<double> (octave_idx_type n, double *p);
 
-  template <> void
+  template <> OCTAVE_API void
   rand_uniform<float> (octave_idx_type n, float *p);
 
-  template <> void
+  template <> OCTAVE_API void
   rand_normal<float> (octave_idx_type n, float *p);
 
-  template <> void
+  template <> OCTAVE_API void
   rand_exponential<float> (octave_idx_type n, float *p);
 }
 
--- a/liboctave/numeric/randpoisson.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/randpoisson.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -455,6 +455,6 @@
     return ret;
   }
 
-  template double rand_poisson<double> (double);
-  template float rand_poisson<float> (float);
+  template OCTAVE_API double rand_poisson<double> (double);
+  template OCTAVE_API float rand_poisson<float> (float);
 }
--- a/liboctave/numeric/randpoisson.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/randpoisson.h	Tue Dec 29 17:51:23 2020 +0100
@@ -33,9 +33,9 @@
 
 namespace octave
 {
-  template <typename T> void rand_poisson (T L, octave_idx_type n, T *p);
+  template <typename T> OCTAVE_API void rand_poisson (T L, octave_idx_type n, T *p);
 
-  template <typename T> T rand_poisson (T L);
+  template <typename T> OCTAVE_API T rand_poisson (T L);
 }
 
 #endif
--- a/liboctave/numeric/schur.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/schur.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -98,7 +98,7 @@
     }
 
     template <>
-    F77_INT
+    OCTAVE_API F77_INT
     schur<Matrix>::init (const Matrix& a, const std::string& ord, bool calc_unitary)
     {
       F77_INT a_nr = to_f77_int (a.rows ());
@@ -184,7 +184,7 @@
     }
 
     template <>
-    F77_INT
+    OCTAVE_API F77_INT
     schur<FloatMatrix>::init (const FloatMatrix& a, const std::string& ord,
                               bool calc_unitary)
     {
@@ -271,7 +271,7 @@
     }
 
     template <>
-    F77_INT
+    OCTAVE_API F77_INT
     schur<ComplexMatrix>::init (const ComplexMatrix& a, const std::string& ord,
                                 bool calc_unitary)
     {
@@ -354,7 +354,7 @@
     }
 
     template <>
-    schur<ComplexMatrix>
+    OCTAVE_API schur<ComplexMatrix>
     rsf2csf<ComplexMatrix, Matrix> (const Matrix& s_arg, const Matrix& u_arg)
     {
       ComplexMatrix s (s_arg);
@@ -379,7 +379,7 @@
     }
 
     template <>
-    F77_INT
+    OCTAVE_API F77_INT
     schur<FloatComplexMatrix>::init (const FloatComplexMatrix& a,
                                      const std::string& ord, bool calc_unitary)
     {
@@ -462,7 +462,7 @@
     }
 
     template <>
-    schur<FloatComplexMatrix>
+    OCTAVE_API schur<FloatComplexMatrix>
     rsf2csf<FloatComplexMatrix, FloatMatrix> (const FloatMatrix& s_arg,
                                               const FloatMatrix& u_arg)
     {
--- a/liboctave/numeric/schur.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/schur.h	Tue Dec 29 17:51:23 2020 +0100
@@ -95,12 +95,12 @@
       T schur_mat;
       T unitary_mat;
 
-      octave_f77_int_type
+      OCTAVE_API octave_f77_int_type
       init (const T& a, const std::string& ord, bool calc_unitary);
     };
 
     template <typename RT, typename AT>
-    extern schur<RT>
+    extern OCTAVE_API schur<RT>
     rsf2csf (const AT& s, const AT& u);
   }
 }
--- a/liboctave/numeric/sparse-chol.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-chol.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -591,6 +591,7 @@
     // different from the default).
 
     template <>
+    OCTAVE_API
     sparse_chol<SparseComplexMatrix>::sparse_chol (const SparseComplexMatrix& a,
                                                    octave_idx_type& info)
       : rep (new sparse_chol<SparseComplexMatrix>::sparse_chol_rep (a, info,
@@ -600,14 +601,15 @@
 
     // Instantiations we need.
 
-    template class sparse_chol<SparseMatrix>;
+    template class OCTAVE_API sparse_chol<SparseMatrix>;
 
     template class sparse_chol<SparseComplexMatrix>;
 
-    template SparseMatrix
+    template OCTAVE_API SparseMatrix
     chol2inv<SparseMatrix> (const SparseMatrix& r);
 
-    template SparseComplexMatrix
+    template OCTAVE_API SparseComplexMatrix
     chol2inv<SparseComplexMatrix> (const SparseComplexMatrix& r);
+
   }
 }
--- a/liboctave/numeric/sparse-chol.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-chol.h	Tue Dec 29 17:51:23 2020 +0100
@@ -45,6 +45,7 @@
 
     template <typename chol_type>
     class
+    OCTAVE_API
     sparse_chol
     {
     public:
@@ -94,14 +95,9 @@
     };
 
     template <typename chol_type>
+    OCTAVE_API
     chol_type
     chol2inv (const chol_type& r);
-
-    // SparseComplexMatrix specialization.
-
-    template <>
-    sparse_chol<SparseComplexMatrix>::sparse_chol
-      (const SparseComplexMatrix& a, octave_idx_type& info);
   }
 }
 
--- a/liboctave/numeric/sparse-dmsolve.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-dmsolve.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -505,34 +505,34 @@
 
 // Instantiations we need.
 
-template ComplexMatrix
+template OCTAVE_API ComplexMatrix
 dmsolve<ComplexMatrix, SparseComplexMatrix, Matrix>
   (const SparseComplexMatrix&, const Matrix&, octave_idx_type&);
 
-template SparseComplexMatrix
+template OCTAVE_API SparseComplexMatrix
 dmsolve<SparseComplexMatrix, SparseComplexMatrix, SparseMatrix>
   (const SparseComplexMatrix&, const SparseMatrix&, octave_idx_type&);
 
-template ComplexMatrix
+template OCTAVE_API ComplexMatrix
 dmsolve<ComplexMatrix, SparseComplexMatrix, ComplexMatrix>
   (const SparseComplexMatrix&, const ComplexMatrix&, octave_idx_type&);
 
-template SparseComplexMatrix
+template OCTAVE_API SparseComplexMatrix
 dmsolve<SparseComplexMatrix, SparseComplexMatrix, SparseComplexMatrix>
   (const SparseComplexMatrix&, const SparseComplexMatrix&, octave_idx_type&);
 
-template Matrix
+template OCTAVE_API Matrix
 dmsolve<Matrix, SparseMatrix, Matrix>
   (const SparseMatrix&, const Matrix&, octave_idx_type&);
 
-template SparseMatrix
+template OCTAVE_API SparseMatrix
 dmsolve<SparseMatrix, SparseMatrix, SparseMatrix>
   (const SparseMatrix&, const SparseMatrix&, octave_idx_type&);
 
-template ComplexMatrix
+template OCTAVE_API ComplexMatrix
 dmsolve<ComplexMatrix, SparseMatrix, ComplexMatrix>
   (const SparseMatrix&, const ComplexMatrix&, octave_idx_type&);
 
-template SparseComplexMatrix
+template OCTAVE_API SparseComplexMatrix
 dmsolve<SparseComplexMatrix, SparseMatrix, SparseComplexMatrix>
   (const SparseMatrix&, const SparseComplexMatrix&, octave_idx_type&);
--- a/liboctave/numeric/sparse-dmsolve.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-dmsolve.h	Tue Dec 29 17:51:23 2020 +0100
@@ -29,7 +29,7 @@
 #include "octave-config.h"
 
 template <typename RT, typename ST, typename T>
-RT
+OCTAVE_API RT
 dmsolve (const ST& a, const T& b, octave_idx_type& info);
 
 #endif
--- a/liboctave/numeric/sparse-lu.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-lu.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -127,28 +127,28 @@
     // SparseMatrix Specialization.
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_defaults<double> (double *Control)
     {
       UMFPACK_DNAME (defaults) (Control);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_free_numeric<double> (void **Numeric)
     {
       UMFPACK_DNAME (free_numeric) (Numeric);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_free_symbolic<double> (void **Symbolic)
     {
       UMFPACK_DNAME (free_symbolic) (Symbolic);
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_get_lunz<double>
     (octave_idx_type *lnz, octave_idx_type *unz, void *Numeric)
     {
@@ -160,7 +160,7 @@
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_get_numeric<double>
     (octave_idx_type *Lp, octave_idx_type *Lj, double *Lx,
      octave_idx_type *Up, octave_idx_type *Ui, double *Ux,
@@ -178,7 +178,7 @@
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_numeric<double>
     (const octave_idx_type *Ap, const octave_idx_type *Ai,
      const double *Ax, void *Symbolic, void **Numeric,
@@ -190,7 +190,7 @@
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_qsymbolic<double>
     (octave_idx_type n_row, octave_idx_type n_col, const octave_idx_type *Ap,
      const octave_idx_type *Ai, const double *Ax,
@@ -205,21 +205,21 @@
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_control<double> (const double *Control)
     {
       UMFPACK_DNAME (report_control) (Control);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_info<double> (const double *Control, const double *Info)
     {
       UMFPACK_DNAME (report_info) (Control, Info);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_matrix<double>
     (octave_idx_type n_row, octave_idx_type n_col, const octave_idx_type *Ap,
      const octave_idx_type *Ai, const double *Ax, octave_idx_type col_form,
@@ -232,14 +232,14 @@
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_numeric<double> (void *Numeric, const double *Control)
     {
       UMFPACK_DNAME (report_numeric) (Numeric, Control);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_perm<double>
     (octave_idx_type np, const octave_idx_type *Perm, const double *Control)
     {
@@ -247,14 +247,14 @@
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_status<double> (double *Control, octave_idx_type status)
     {
       UMFPACK_DNAME (report_status) (Control, status);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_symbolic<double> (void *Symbolic, const double *Control)
     {
       UMFPACK_DNAME (report_symbolic) (Symbolic, Control);
@@ -263,28 +263,28 @@
     // SparseComplexMatrix specialization.
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_defaults<Complex> (double *Control)
     {
       UMFPACK_ZNAME (defaults) (Control);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_free_numeric<Complex> (void **Numeric)
     {
       UMFPACK_ZNAME (free_numeric) (Numeric);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_free_symbolic<Complex> (void **Symbolic)
     {
       UMFPACK_ZNAME (free_symbolic) (Symbolic);
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_get_lunz<Complex>
     (octave_idx_type *lnz, octave_idx_type *unz, void *Numeric)
     {
@@ -296,7 +296,7 @@
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_get_numeric<Complex>
     (octave_idx_type *Lp, octave_idx_type *Lj, Complex *Lz,
      octave_idx_type *Up, octave_idx_type *Ui, Complex *Uz,
@@ -317,7 +317,7 @@
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_numeric<Complex>
     (const octave_idx_type *Ap, const octave_idx_type *Ai,
      const Complex *Az, void *Symbolic, void **Numeric,
@@ -330,7 +330,7 @@
     }
 
     template <>
-    inline octave_idx_type
+    inline OCTAVE_API octave_idx_type
     umfpack_qsymbolic<Complex>
     (octave_idx_type n_row, octave_idx_type n_col,
      const octave_idx_type *Ap, const octave_idx_type *Ai,
@@ -346,21 +346,21 @@
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_control<Complex> (const double *Control)
     {
       UMFPACK_ZNAME (report_control) (Control);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_info<Complex> (const double *Control, const double *Info)
     {
       UMFPACK_ZNAME (report_info) (Control, Info);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_matrix<Complex>
     (octave_idx_type n_row, octave_idx_type n_col,
      const octave_idx_type *Ap, const octave_idx_type *Ai,
@@ -374,14 +374,14 @@
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_numeric<Complex> (void *Numeric, const double *Control)
     {
       UMFPACK_ZNAME (report_numeric) (Numeric, Control);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_perm<Complex>
     (octave_idx_type np, const octave_idx_type *Perm, const double *Control)
     {
@@ -389,14 +389,14 @@
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_status<Complex> (double *Control, octave_idx_type status)
     {
       UMFPACK_ZNAME (report_status) (Control, status);
     }
 
     template <>
-    inline void
+    inline OCTAVE_API void
     umfpack_report_symbolic <Complex> (void *Symbolic, const double *Control)
     {
       UMFPACK_ZNAME (report_symbolic) (Symbolic, Control);
@@ -981,9 +981,8 @@
     }
 
     // Instantiations we need.
+    template class OCTAVE_API sparse_lu<SparseMatrix>;
 
-    template class sparse_lu<SparseMatrix>;
-
-    template class sparse_lu<SparseComplexMatrix>;
+    template class OCTAVE_API sparse_lu<SparseComplexMatrix>;
   }
 }
--- a/liboctave/numeric/sparse-lu.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-lu.h	Tue Dec 29 17:51:23 2020 +0100
@@ -55,9 +55,11 @@
       sparse_lu (void)
         : Lfact (), Ufact (), Rfact (), cond (0), P (), Q () { }
 
+      OCTAVE_API
       sparse_lu (const lu_type& a, const Matrix& piv_thres = Matrix (),
                  bool scale = false);
 
+      OCTAVE_API
       sparse_lu (const lu_type& a, const ColumnVector& Qinit,
                  const Matrix& piv_thres, bool scale = false,
                  bool FixedQ = false, double droptol = -1.0,
@@ -90,19 +92,19 @@
 
       SparseMatrix R (void) const { return Rfact; }
 
-      lu_type Y (void) const;
+      OCTAVE_API lu_type Y (void) const;
 
-      SparseMatrix Pc (void) const;
+      OCTAVE_API SparseMatrix Pc (void) const;
 
-      SparseMatrix Pr (void) const;
+      OCTAVE_API SparseMatrix Pr (void) const;
 
-      ColumnVector Pc_vec (void) const;
+      OCTAVE_API ColumnVector Pc_vec (void) const;
 
-      ColumnVector Pr_vec (void) const;
+      OCTAVE_API ColumnVector Pr_vec (void) const;
 
-      PermMatrix Pc_mat (void) const;
+      OCTAVE_API PermMatrix Pc_mat (void) const;
 
-      PermMatrix Pr_mat (void) const;
+      OCTAVE_API PermMatrix Pr_mat (void) const;
 
       const octave_idx_type * row_perm (void) const { return P.fortran_vec (); }
 
--- a/liboctave/numeric/sparse-qr.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-qr.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -173,6 +173,12 @@
 #endif
     }
 
+    // Instantiations we need.
+
+    template class OCTAVE_API sparse_qr<SparseMatrix>;
+
+    template class OCTAVE_API sparse_qr<SparseComplexMatrix>;
+
     // Specializations.
 
     // Real-valued matrices.
@@ -2360,11 +2366,5 @@
                                                    SparseComplexMatrix>
                                              (a, b, info);
     }
-
-    // Instantiations we need.
-
-    template class sparse_qr<SparseMatrix>;
-
-    template class sparse_qr<SparseComplexMatrix>;
   }
 }
--- a/liboctave/numeric/sparse-qr.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/sparse-qr.h	Tue Dec 29 17:51:23 2020 +0100
@@ -52,34 +52,34 @@
     {
     public:
 
-      sparse_qr (void);
+      OCTAVE_API sparse_qr (void);
 
-      sparse_qr (const SPARSE_T& a, int order = 0);
+      OCTAVE_API sparse_qr (const SPARSE_T& a, int order = 0);
 
-      sparse_qr (const sparse_qr& a);
+      OCTAVE_API sparse_qr (const sparse_qr& a);
 
-      ~sparse_qr (void);
+      OCTAVE_API ~sparse_qr (void);
 
-      sparse_qr& operator = (const sparse_qr& a);
+      OCTAVE_API sparse_qr& operator = (const sparse_qr& a);
 
-      bool ok (void) const;
+      OCTAVE_API bool ok (void) const;
 
-      SPARSE_T V (void) const;
+      OCTAVE_API SPARSE_T V (void) const;
 
-      ColumnVector Pinv (void) const;
+      OCTAVE_API ColumnVector Pinv (void) const;
 
-      ColumnVector P (void) const;
+      OCTAVE_API ColumnVector P (void) const;
 
-      SPARSE_T R (bool econ = false) const;
+      OCTAVE_API SPARSE_T R (bool econ = false) const;
 
-      typename SPARSE_T::dense_matrix_type
+      OCTAVE_API typename SPARSE_T::dense_matrix_type
       C (const typename SPARSE_T::dense_matrix_type& b) const;
 
-      typename SPARSE_T::dense_matrix_type
+      OCTAVE_API typename SPARSE_T::dense_matrix_type
       Q (void) const;
 
       template <typename RHS_T, typename RET_T>
-      static RET_T
+      static OCTAVE_API RET_T
       solve (const SPARSE_T& a, const RHS_T& b,
              octave_idx_type& info);
 
@@ -90,50 +90,50 @@
       sparse_qr_rep *rep;
 
       template <typename RHS_T, typename RET_T>
-      RET_T
+      OCTAVE_API RET_T
       tall_solve (const RHS_T& b, octave_idx_type& info) const;
 
       template <typename RHS_T, typename RET_T>
-      RET_T
+      OCTAVE_API RET_T
       wide_solve (const RHS_T& b, octave_idx_type& info) const;
     };
 
     // Provide qrsolve for backward compatibility.
 
-    extern Matrix
+    extern OCTAVE_API Matrix
     qrsolve (const SparseMatrix& a, const MArray<double>& b,
              octave_idx_type& info);
 
-    extern SparseMatrix
+    extern OCTAVE_API SparseMatrix
     qrsolve (const SparseMatrix& a, const SparseMatrix& b,
              octave_idx_type& info);
 
-    extern ComplexMatrix
+    extern OCTAVE_API ComplexMatrix
     qrsolve (const SparseMatrix& a, const MArray<Complex>& b,
              octave_idx_type& info);
 
-    extern SparseComplexMatrix
+    extern OCTAVE_API SparseComplexMatrix
     qrsolve (const SparseMatrix& a, const SparseComplexMatrix& b,
              octave_idx_type& info);
 
-    extern ComplexMatrix
+    extern OCTAVE_API ComplexMatrix
     qrsolve (const SparseComplexMatrix& a, const MArray<double>& b,
              octave_idx_type& info);
 
-    extern SparseComplexMatrix
+    extern OCTAVE_API SparseComplexMatrix
     qrsolve (const SparseComplexMatrix& a, const SparseMatrix& b,
              octave_idx_type& info);
 
-    extern ComplexMatrix
+    extern OCTAVE_API ComplexMatrix
     qrsolve (const SparseComplexMatrix& a, const MArray<Complex>& b,
              octave_idx_type& info);
 
-    extern SparseComplexMatrix
+    extern OCTAVE_API SparseComplexMatrix
     qrsolve (const SparseComplexMatrix& a, const SparseComplexMatrix& b,
              octave_idx_type& info);
 
-    typedef sparse_qr<SparseMatrix> SparseQR;
-    typedef sparse_qr<SparseComplexMatrix> SparseComplexQR;
+    //typedef sparse_qr<SparseMatrix> SparseQR;
+    //typedef sparse_qr<SparseComplexMatrix> SparseComplexQR;
   }
 }
 
--- a/liboctave/numeric/svd.cc	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/svd.cc	Tue Dec 29 17:51:23 2020 +0100
@@ -90,7 +90,7 @@
 
     // DGESVD
     template<>
-    void
+    OCTAVE_API void
     svd<Matrix>::gesvd (char& jobu, char& jobv, F77_INT m, F77_INT n,
                         double *tmp_data, F77_INT m1, double *s_vec,
                         double *u, double *vt, F77_INT nrow_vt1,
@@ -107,7 +107,7 @@
 
     // SGESVD
     template<>
-    void
+    OCTAVE_API void
     svd<FloatMatrix>::gesvd (char& jobu, char& jobv, F77_INT m, F77_INT n,
                              float *tmp_data, F77_INT m1, float *s_vec,
                              float *u, float *vt, F77_INT nrow_vt1,
@@ -124,7 +124,7 @@
 
     // ZGESVD
     template<>
-    void
+    OCTAVE_API void
     svd<ComplexMatrix>::gesvd (char& jobu, char& jobv, F77_INT m, F77_INT n,
                                Complex *tmp_data, F77_INT m1, double *s_vec,
                                Complex *u, Complex *vt, F77_INT nrow_vt1,
@@ -143,7 +143,7 @@
 
     // CGESVD
     template<>
-    void
+    OCTAVE_API void
     svd<FloatComplexMatrix>::gesvd (char& jobu, char& jobv, F77_INT m,
                                     F77_INT n, FloatComplex *tmp_data,
                                     F77_INT m1, float *s_vec, FloatComplex *u,
@@ -183,7 +183,7 @@
 
     // DGESDD
     template<>
-    void
+    OCTAVE_API void
     svd<Matrix>::gesdd (char& jobz, F77_INT m, F77_INT n, double *tmp_data,
                         F77_INT m1, double *s_vec, double *u, double *vt,
                         F77_INT nrow_vt1, std::vector<double>& work,
@@ -199,7 +199,7 @@
 
     // SGESDD
     template<>
-    void
+    OCTAVE_API void
     svd<FloatMatrix>::gesdd (char& jobz, F77_INT m, F77_INT n, float *tmp_data,
                              F77_INT m1, float *s_vec, float *u, float *vt,
                              F77_INT nrow_vt1, std::vector<float>& work,
@@ -215,7 +215,7 @@
 
     // ZGESDD
     template<>
-    void
+    OCTAVE_API void
     svd<ComplexMatrix>::gesdd (char& jobz, F77_INT m, F77_INT n,
                                Complex *tmp_data, F77_INT m1, double *s_vec,
                                Complex *u, Complex *vt, F77_INT nrow_vt1,
@@ -244,7 +244,7 @@
 
     // CGESDD
     template<>
-    void
+    OCTAVE_API void
     svd<FloatComplexMatrix>::gesdd (char& jobz, F77_INT m, F77_INT n,
                                     FloatComplex *tmp_data, F77_INT m1,
                                     float *s_vec, FloatComplex *u,
--- a/liboctave/numeric/svd.h	Tue Dec 29 17:41:39 2020 +0100
+++ b/liboctave/numeric/svd.h	Tue Dec 29 17:51:23 2020 +0100
@@ -36,6 +36,7 @@
   {
     template <typename T>
     class
+    OCTAVE_API
     svd
     {
     public: