# Link error on declaring metrics in two different classes

**URL:** https://discourse.itk.org/t/link-error-on-declaring-metrics-in-two-different-classes/2600
**Category:** Engineering
**Tags:** registration
**Created:** [January 10, 2020, 2:38pm UTC](https://discourse.itk.org/t/link-error-on-declaring-metrics-in-two-different-classes/2600 "2020-01-10T14:38:20Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![sbruge](https://discourse.itk.org/letter_avatar_proxy/v4/letter/s/5daacb/32.png) [@sbruge](https://discourse.itk.org/u/sbruge)
#### Post date: [January 10, 2020, 2:38pm UTC](https://discourse.itk.org/t/link-error-on-declaring-metrics-in-two-different-classes/2600/1 "2020-01-10T14:38:21Z")

</div>

Hi everyone,

I’m stuck on a compilation issue using visual studio (2017 or 2019). I need to implement two classes: one using GradientDifferenceImageToImageMetric and another one using MeanSquaresImageToImageMetricv4. But, when I am trying to build my application I get the following error:

```nohighlight
1>main.cpp
1>ITKOptimizers-5.0.lib(ITKOptimizers-5.0.dll) : error LNK2005: "protected: virtual void __cdecl itk::CostFunctionTemplate<double>::PrintSelf(class std::basic_ostream<char,struct std::char_traits<char> > &,class itk::Indent)const " (?PrintSelf?$CostFunctionTemplateNitkMEBAXAEAV?$basic_ostreamDU?$char_traitsDstdstdVIndent2Z) déjà défini(e) dans itkTransformInitialization.obj
1>\ClinicalValidation\build\Debug\ImageRegistration.exe : fatal error LNK1169: one or more multiply defined symbols found

```

Here the minimal code to reproduce this issue:

```auto
//itkTransformInitialization.h
#ifndef itkTransformInitialization_h
#define itkTransformInitialization_h

#include <itkMeanSquaresImageToImageMetricv4.h>

class itkTransformInitialization
{
public:
itkTransformInitialization()
  {
  using InternalPixelType = float;
  using InternalImageType = itk::Image< InternalPixelType, 2 >;
  using MetricType = itk::MeanSquaresImageToImageMetricv4<InternalImageType, InternalImageType >;
  MetricType::Pointer metric = MetricType::New();
}
  ~itkTransformInitialization(){}
};
#endif

```

```auto
//itkTransformOptimization.h
#ifndef itkTransformOptimization_h
#define itkTransformOptimization_h

#include <itkGradientDifferenceImageToImageMetric.h>

class itkTransformOptimization
{
public:
  itkTransformOptimization()
 {
  using InternalPixelType = float;
  using InternalImageType = itk::Image< InternalPixelType, 3 >;
  using OptimMetricType = itk::GradientDifferenceImageToImageMetric< InternalImageType, InternalImageType >;
  OptimMetricType::Pointer metric = OptimMetricType::New();
 }
  ~itkTransformOptimization(){}
};
#endif

```

```auto
//main.cpp
#include "itkTransformInitialization.h"
#include "itkTransformOptimization.h"

#include <iostream>

int main( int argc, char** argv )
{
  std::cerr << "Include success" << std::endl;
  return 1;
}

```

Does anyone have an idea of how to fix it? Thx.

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [January 10, 2020, 2:43pm UTC](https://discourse.itk.org/t/link-error-on-declaring-metrics-in-two-different-classes/2600/2 "2020-01-10T14:43:44Z")

</div>

How does you `CMakeLists.txt` look like?

---

<div class="post-metadata">

### Author: ![sbruge](https://discourse.itk.org/letter_avatar_proxy/v4/letter/s/5daacb/32.png) [@sbruge](https://discourse.itk.org/u/sbruge)
#### Post date: [January 10, 2020, 2:46pm UTC](https://discourse.itk.org/t/link-error-on-declaring-metrics-in-two-different-classes/2600/3 "2020-01-10T14:46:11Z")

</div>

My CmakeLists is very simple:

```auto
cmake_minimum_required(VERSION 2.8)
 
PROJECT(ImageRegistration)

find_package(ITK REQUIRED)
include(${ITK_USE_FILE})

set( ImageRegistration_SRCS
  main.cpp
  itkTransformOptimization.cxx
  itkTransformInitialization.cxx
  )
 
add_executable(ImageRegistration ${ImageRegistration_SRCS})
target_link_libraries(ImageRegistration ${ITK_LIBRARIES})

```

---

<div class="post-metadata">

### Author: ![dzenanz](https://discourse.itk.org/user_avatar/discourse.itk.org/dzenanz/32/1093_2.png) [@dzenanz](https://discourse.itk.org/u/dzenanz)
#### Post date: [January 10, 2020, 8:20pm UTC](https://discourse.itk.org/t/link-error-on-declaring-metrics-in-two-different-classes/2600/4 "2020-01-10T20:20:13Z")

</div>

The problem comes from both `itkTransformOptimization.cxx` and `itkTransformInitialization.cxx` instantiating `CostFunctionTemplate`, thus leading to duplicate definition error. If you put all these definitions into one file (`main.cpp`) the error should go away.
