Ensure DynamicCostFunctionToFunctor to be exported

Fixes #1022

Change-Id: I090790ac4a1f32e6cb318bc32273d63898659dc3
diff --git a/include/ceres/dynamic_cost_function_to_functor.h b/include/ceres/dynamic_cost_function_to_functor.h
index bc2fd3b..9226cf4 100644
--- a/include/ceres/dynamic_cost_function_to_functor.h
+++ b/include/ceres/dynamic_cost_function_to_functor.h
@@ -1,5 +1,5 @@
 // Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2023 Google Inc. All rights reserved.
+// Copyright 2025 Google Inc. All rights reserved.
 // http://ceres-solver.org/
 //
 // Redistribution and use in source and binary forms, with or without
@@ -105,20 +105,13 @@
 class CERES_EXPORT DynamicCostFunctionToFunctor {
  public:
   // Takes ownership of cost_function.
-  explicit DynamicCostFunctionToFunctor(CostFunction* cost_function)
-      : DynamicCostFunctionToFunctor{
-            std::unique_ptr<CostFunction>{cost_function}} {}
+  explicit DynamicCostFunctionToFunctor(CostFunction* cost_function);
 
   // Takes ownership of cost_function.
   explicit DynamicCostFunctionToFunctor(
-      std::unique_ptr<CostFunction> cost_function)
-      : cost_function_(std::move(cost_function)) {
-    CHECK(cost_function_ != nullptr);
-  }
+      std::unique_ptr<CostFunction> cost_function);
 
-  bool operator()(double const* const* parameters, double* residuals) const {
-    return cost_function_->Evaluate(parameters, residuals, nullptr);
-  }
+  bool operator()(double const* const* parameters, double* residuals) const;
 
   template <typename JetT>
   bool operator()(JetT const* const* inputs, JetT* output) const {
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index 1355a38..c409eef 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -1,5 +1,5 @@
 # Ceres Solver - A fast non-linear least squares minimizer
-# Copyright 2022 Google Inc. All rights reserved.
+# Copyright 2024 Google Inc. All rights reserved.
 # http://ceres-solver.org/
 #
 # Redistribution and use in source and binary forms, with or without
@@ -179,6 +179,7 @@
     dogleg_strategy.cc
     dynamic_compressed_row_jacobian_writer.cc
     dynamic_compressed_row_sparse_matrix.cc
+    dynamic_cost_function_to_functor.cc
     dynamic_sparse_normal_cholesky_solver.cc
     eigensparse.cc
     evaluation_callback.cc
diff --git a/internal/ceres/dynamic_cost_function_to_functor.cc b/internal/ceres/dynamic_cost_function_to_functor.cc
new file mode 100644
index 0000000..42e8fac
--- /dev/null
+++ b/internal/ceres/dynamic_cost_function_to_functor.cc
@@ -0,0 +1,54 @@
+// Ceres Solver - A fast non-linear least squares minimizer
+// Copyright 2025 Google Inc. All rights reserved.
+// http://ceres-solver.org/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+//   this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+//   this list of conditions and the following disclaimer in the documentation
+//   and/or other materials provided with the distribution.
+// * Neither the name of Google Inc. nor the names of its contributors may be
+//   used to endorse or promote products derived from this software without
+//   specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: sameeragarwal@google.com (Sameer Agarwal)
+//         dgossow@google.com (David Gossow)
+
+#include "ceres/dynamic_cost_function_to_functor.h"
+
+#include <memory>
+
+namespace ceres {
+
+DynamicCostFunctionToFunctor::DynamicCostFunctionToFunctor(
+    CostFunction* cost_function)
+    : DynamicCostFunctionToFunctor{
+          std::unique_ptr<CostFunction>{cost_function}} {}
+
+DynamicCostFunctionToFunctor::DynamicCostFunctionToFunctor(
+    std::unique_ptr<CostFunction> cost_function)
+    : cost_function_(std::move(cost_function)) {
+  CHECK(cost_function_ != nullptr);
+}
+
+bool DynamicCostFunctionToFunctor::operator()(double const* const* parameters,
+                                              double* residuals) const {
+  return cost_function_->Evaluate(parameters, residuals, nullptr);
+}
+
+}  // namespace ceres