C ++ MSVS项目内链接器错误LNK2019 - 声明定义不匹配?

时间:2014-06-11 10:22:27

标签: c++ cmake linker-errors itk

我试图阅读有关链接器错误的所有内容,这些错误似乎适用于我的代码,但我还没有找到解决方案,所以非常感谢帮助wpuld。根据我的阅读,链接器错误的唯一原因似乎适用于我的代码,因为它之前工作正常并且它只包含来自单个MSVS项目的文件,是声明/定义不匹配,但是不要为了那个而接受我的话。

我在Visual Studio 2010项目中有四个文件feir.cppfeir.hfilters.cppfilters.h。直到最近在main函数中添加一行代码(在feir.cpp中),从resampler文件中调用函数filters.cpp一切正常。这个函数调用是对feir.cpp - 文件之外的函数的第一次调用,所以我想我在将所有内容绑在一起时做错了。错误消息显示在本文末尾。以下是代码的相关部分:

feir.cpp

...
#include "feir.h"
#include "itkImage.h"
#include <string>
#include "filters.h"

int main( int argc, char* argv[] )
{
...
ImageType::Pointer moving;  
ImageType::Pointer target;
std::tie(moving, std::ignore) = preRegistrationOperations( inputDir, movingDir, movingSeriesNumber, preparationsDone, verbose, selectSliceMoving ); 
std::tie(target, std::ignore) = preRegistrationOperations( inputDir, targetDir, targetSeriesNumber, preparationsDone, verbose, selectSliceTarget );
...
ImageType::Pointer resampledTarget = resampler ( target, moving );    
}

filters.h

...
ImageType::Pointer resampler( ImageType::Pointer image, ImageType::Pointer imageTemplate, std::string interpolate = "Linear");

filters.cpp

...
ImageType::Pointer resampler( ImageType::Pointer image, ImageType::Pointer imageTemplate, std::string interpolate )
{
...
ImageType::Pointer resampled = ImageType::New();
resampled = filter->GetOutput();    
return resampled;
}
编辑:在@Roger Rowlands发表评论后,我添加了以下内容: 我使用CMake配置并生成该项目的解决方案,然后在MSVS中构建解决方案。但是,我不得不承认,所有这些的含义超出了我有限的编程知识,所以我不确定这是否是问题,在这种情况下,为什么。因此,如果我在项目中包含了一个附加文件,我是否应该更改我的CMakeLists.txt文件并再次生成解决方案?到目前为止,在我非常短的ITK编程生涯中,我只考虑过CMake一个必要的邪恶,而不是理解它实际上做了什么......我的CMakeLists.txt文件看起来像这样:

的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(feir)
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})
add_executable(feir feir.cpp)
target_link_libraries(feir ${ITK_LIBRARIES})

希望有人可以帮助我。干杯!

链接器错误

  

错误1错误LNK2019:未解析的外部符号&#34;类itk :: SmartPointer&lt; class itk :: Image&lt; short,3&gt; &GT; __cdecl resampler(类itk :: SmartPointer&lt; class itk :: Image&lt; short,3&gt;&gt;,class itk :: SmartPointer&lt; class itk :: Image&lt; short,3&gt;&gt;,class std :: basic_string&lt; char,struct std :: char_traits&lt; char&gt;,class std :: allocator&lt; char&gt;&gt;)&#34; (?重采样器@@ YA?AV?$智能指针@ V'$图片@ F $ @版本02 ITK ITK @@@ @@ @ V12 0V?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ 2 @@ std @@@ Z)在函数_main C:\ Users \ 310079322 \ Documents \ ITK_VTK \ feir \ bin \ feir.obj feir

中引用

1 个答案:

答案 0 :(得分:3)

您需要在其项目中包含所有可执行文件(或库)的源文件,以便Visual Studio知道将它们链接在一起。在普通的VS中,这意味着将它们添加到项目的Source Files文件夹中(而不是就像解决方案项一样)。

在CMake中,它意味着在add_executable()add_library()命令中列出它们。所以改变你的CMakeList如下:

add_executable(feir feir.cpp filters.cpp)

(注意:您可能也想将头文件放在那里。它不需要构建或链接,但它们将显示在VS的解决方案资源管理器中的正确过滤器中。)

如果不以某种方式包含所有相关文件,链接器就不知道它应该链接它们。