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/

相关文章:

cmake - 如何使用 add_custom_command 使用生成器表达式复制 dll?

c++ - fatal error LNK1104 : cannot open file 'MSVCRT.lib'

c++ - 注释掉函数体在 VS 2012 中给出奇怪的链接错误

c++ - 基础接口(interface)的 shared_ptr 的初始化和管理

c++ - 释放从 placement new 分配的内存

c++ - BEGIN_MSG_MAP_EX 破坏了 Visual Studio 2005 智能感知?

c++ - 枚举和索引所有可能的 n 个顶点的树

CMake:定义自定义包含路径

gcc - Cmake 更改编译标志

c++ - C++ 类层次结构实现中的模糊链接器错误