簡體   English   中英

C ++ MSVS項目內鏈接器錯誤LNK2019 - 聲明定義不匹配?

[英]C++ MSVS within-project linker error LNK2019 - Declaration definition mismatch?

我試圖閱讀有關鏈接器錯誤的所有內容,這些錯誤似乎適用於我的代碼,但我找不到解決方案,所以非常感謝幫助wpuld。 從我讀過的,鏈接器錯誤的唯一原因似乎適用於我的代碼,因為它之前工作正常並且它只包含來自單個MSVS項目的文件,是聲明/定義不匹配,但不請相信我的話。

我有四個文件, feir.cppfeir.hfilters.cppfilters.h在Visual Studio 2010中的項目。 直到最近除了一條線在主功能(在代碼的feir.cpp )調用該函數resamplerfilters.cpp -file一切正常。 這個函數調用是第一次調用feir.cpp -file之外的函數,所以我猜我把所有東西綁在一起都做錯了。 錯誤消息顯示在本文末尾。 以下是代碼的相關部分:

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:未解析的外部符號“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?$智能指針@ V'$圖片@ F $ @版本02 ITK ITK @@@ @@ @ V12 0V?$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@函數_main C:\\ Users \\ 310079322 \\ Documents \\ ITK_VTK \\ feir \\ bin \\ feir.obj feir中引用的@Z)

您需要在其項目中包含所有可執行文件(或庫)的源文件,以便Visual Studio知道將它們鏈接在一起。 在普通的VS,那將意味着將它們添加到項目的源文件夾(而不是僅僅作為解決方案項)。

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

add_executable(feir feir.cpp filters.cpp)

(注意:您可能也想將頭文件放在那里。它不需要構建或鏈接,但它們將顯示在VS的解決方案資源管理器中的正確過濾器中)。

如果不以某種方式包含所有相關文件,鏈接器就不知道它應該鏈接它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM