【问题标题】:C++ MSVS within-project linker error LNK2019 - Declaration definition mismatch?C++ MSVS 项目内链接器错误 LNK2019 - 声明定义不匹配?
【发布时间】:2014-06-11 10:22:26
【问题描述】:

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

我在 Visual Studio 2010 项目中有四个文件,feir.cppfeir.hfilters.cppfilters.h。直到最近在主函数(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");

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})

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

链接器错误

Error 1 error LNK2019: unresolved external symbol "class itk::SmartPointer > __cdecl resampler(class itk::SmartPointer >,类 itk::SmartPointer >,class std::basic_string,class std::allocator)" (?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) 在函数 _main C:\Users\310079322\Documents\ITK_VTK\feir\bin\feir.obj feir 中引用

【问题讨论】:

  • 1. filters.cpp 是项目的一部分吗? 2. 函数声明或定义周围/附近是否存在filters.hfilters.cpp 中的命名空间?
  • 在您添加该行之前它工作正常,因为它不需要链接 ITK 的东西。我的猜测是您没有在项目属性中设置 ITK 库。
  • @Angew, 1. 我认为是:我在 MSVS 中选择了 'Project' - 'Add existing item' 并添加了它以及它的头文件,所以在解决方案资源管理器中它们显示在名为“解决方案项目”的文件夹中的解决方案树。因此,在解决方案资源管理器中,它们不会显示在显示 feir.cpp 的源文件文件夹中。但是,我已将它们复制到 feir.cpp 的源代码文件夹 (...\feir\src) 中。 2. 任何地方都不涉及命名空间。
  • @Roger 好点子,我认为您正在做某事。我应该用 CMake 生成一个新的解决方案文件吗?我将在原始帖子中添加更多信息。

标签: c++ cmake linker-errors itk


【解决方案1】:

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

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

add_executable(feir feir.cpp filters.cpp)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多