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

标签 c++ cmake linker-errors itk

我已尝试阅读所有我能找到的似乎适用于我的代码的链接器错误,但我还没有找到解决方案,因此非常感谢您的帮助。从我读过的内容来看,链接器错误似乎适用于我的代码的唯一原因是声明/定义不匹配,因为它之前工作正常并且它只包含来自一个 MSVS 项目的文件请相信我的话。

我有四个文件,feir.cppfeir.hfilters.cppfilters.h 在 Visual Studio 2010 项目中。直到最近在主函数中添加了一行代码(在 feir.cpp 中)从 filters.cpp 调用函数 resampler >-文件一切正常。此函数调用是第一次调用 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");

过滤器.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})

希望有人能帮助我。干杯!

链接器错误

Error 1 error LNK2019: unresolved external symbol "class itk::SmartPointer<class itk::Image<short,3> > __cdecl resampler(class itk::SmartPointer<class itk::Image<short,3> >,class itk::SmartPointer<class itk::Image<short,3> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?resampler@@YA?AV?$SmartPointer@V?$Image@F$02@itk@@@itk@@V12@0V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function _main C:\Users\310079322\Documents\ITK_VTK\feir\bin\feir.obj feir

最佳答案

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

在 CMake 中,这意味着将它们列在 add_executable()add_library() 命令中。所以像这样更改您的 CMakeList:

add_executable(feir feir.cpp filters.cpp)

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

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

关于C++ MSVS 项目内链接器错误 LNK2019 - 声明定义不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24160486/

相关文章:

c - 是否可以使用 CMAKE 在 make install 上重新编译一些源文件

MacOS - clang 地址清理程序无法链接

c++ - qt5 undefined reference 'QApplication::QApplication(int&, char**, int)'

C++ 表达式计算 : What Happens "Under The Hood"?

c++ - getline() 和 vector (C++) 的问题

c++ - 有没有免费的 OCaml 到 C 的翻译器?

c++ - 将 uint64_t 除以 numeric_limits<uint64_t>::max() 为浮点表示形式

c++ - 如何在 Windows 上链接动态构建的 cmake 文件?

c - 我应该在 CLion 中包含哪个库才能启用 readline

c++ - 使用 Windows SDK 7.1 的 Visual Studio 2005 链接错误