From c286aa7931ce32935f51a7ee1c015370e4754ca2 Mon Sep 17 00:00:00 2001
From: Lars Bilke <lars.bilke@ufz.de>
Date: Tue, 13 Sep 2022 22:26:44 +0200
Subject: [PATCH] [ML] Fixed linking issue under macOS when
 BUILD_SHARED_LIBS=ON.

Linker error was:

Undefined symbols for architecture arm64:
  "MaterialLib::Solids::Ehlers::StateVariables<2>::getEquivalentPlasticStrain() const", referenced from:
      vtable for MaterialLib::Solids::Ehlers::StateVariables<2> in unity_0_cxx.cxx.o
  "MaterialLib::Solids::Ehlers::StateVariables<3>::getEquivalentPlasticStrain() const", referenced from:
      vtable for MaterialLib::Solids::Ehlers::StateVariables<3> in
      unity_0_cxx.cxx.o
---
 MaterialLib/SolidModels/Ehlers.cpp |  3 +++
 MaterialLib/SolidModels/Ehlers.h   | 10 ++++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/MaterialLib/SolidModels/Ehlers.cpp b/MaterialLib/SolidModels/Ehlers.cpp
index 28adfbd6cae..83995b28955 100644
--- a/MaterialLib/SolidModels/Ehlers.cpp
+++ b/MaterialLib/SolidModels/Ehlers.cpp
@@ -842,6 +842,9 @@ SolidEhlers<DisplacementDim>::getInternalVariables() const
 template class SolidEhlers<2>;
 template class SolidEhlers<3>;
 
+template struct StateVariables<2>;
+template struct StateVariables<3>;
+
 template <>
 MathLib::KelvinVector::KelvinMatrixType<3> sOdotS<3>(
     MathLib::KelvinVector::KelvinVectorType<3> const& v)
diff --git a/MaterialLib/SolidModels/Ehlers.h b/MaterialLib/SolidModels/Ehlers.h
index 9c9d3ec2bfb..d984878cf13 100644
--- a/MaterialLib/SolidModels/Ehlers.h
+++ b/MaterialLib/SolidModels/Ehlers.h
@@ -24,11 +24,10 @@
 
 #include "BaseLib/Error.h"
 #include "MathLib/KelvinVector.h"
+#include "MechanicsBase.h"
 #include "NumLib/NewtonRaphson.h"
 #include "ParameterLib/Parameter.h"
 
-#include "MechanicsBase.h"
-
 namespace MaterialLib
 {
 namespace Solids
@@ -250,8 +249,8 @@ struct StateVariables
     Damage damage_prev;                      ///< \copydoc damage
 
 #ifndef NDEBUG
-    friend std::ostream& operator<<(
-        std::ostream& os, StateVariables<DisplacementDim> const& m)
+    friend std::ostream& operator<<(std::ostream& os,
+                                    StateVariables<DisplacementDim> const& m)
     {
         os << "State:\n"
            << "eps_p_D: " << m.eps_p.D << "\n"
@@ -358,6 +357,9 @@ private:
 
 extern template class SolidEhlers<2>;
 extern template class SolidEhlers<3>;
+
+extern template struct StateVariables<2>;
+extern template struct StateVariables<3>;
 }  // namespace Ehlers
 }  // namespace Solids
 }  // namespace MaterialLib
-- 
GitLab