2017-06-21 75 views
2

我正在遷移一些項目使用CMake構建系統。現在我正在使用Catch庫添加一些單元測試項目。它是僅標題庫。舊的Visual Studio項目建立良好,但新的CMake項目給出了無法解析的外部符號鏈接器錯誤。我在我的一個源文件中定義了CATCH_CONFIG_MAIN。添加了所有測試所需的其他項目的所有cpp文件以及與其他測試項目所依賴的所有庫鏈接的文件。儘管這樣,我只有從CMake項目產生解析的外部符號錯誤:無法解析的外部符號與捕捉庫

ChipCountTests.obj : error LNK2019: unresolved external symbol "public: __thiscall Catch::SourceLineInfo::SourceLineInfo(char const *,unsigned int)" ([email protected]@@[email protected]@Z) referenced in function "void __cdecl `anonymous namespace'::`dynamic initializer for 'autoRegistrar1''(void)" ([email protected][email protected]@YAXXZ) 
1>FlyingChipRewardCalculatorUT.obj : error LNK2001: unresolved external symbol "public: __thiscall Catch::SourceLineInfo::SourceLineInfo(char const *,unsigned int)" ([email protected]@@[email protected]@Z) 

顯然我錯過了從vcxproj增加一些配置CMakeLists.txt但我目前還沒有弄明白。

+0

顯然你錯過了一些Catch庫。如果在VS項目的鏈接器部分找不到它們;然後嘗試在Catch的頭文件中查找'#pragma comment(lib,「name-of-catch-library」)'這將導致鏈接器自動拾取指定的庫。 –

+1

@Richard Critten正如我所說的catch庫只是頭文件而且沒有** libs **。 – bobeff

+2

您是否使用CMake集成的「官方」指令? https://github.com/philsquared/Catch/blob/master/docs/build-systems.md(請參閱CMake部分) –

回答

1

在我的文件我有:

#define CATCH_CONFIG_MAIN 
#include <catch.hpp> 

,但我也使用CMake的宏添加預編譯頭的項目:

add_precompiled_header (${TARGET_NAME} 
    ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.h 
    ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.cpp) 

這個宏有力地包括在所有預編譯頭文件,但在其中我有#include <catch.hpp>沒有#define CATCH_CONFIG_MAIN這是除了一個所需的所有文件。

我給宏添加了選項來傳遞不包含預編譯頭文件的文件列表,這就解決了這個問題。

1

從您提供的上下文中推斷具體問題有點難,但here是CMake集成的正式Catch指令。

根據我的經驗,在Visual Studio中使用它 - 整合工作進展順利。

+0

+1感謝您將我指向** CMake **的官方** Catch **文檔,但我沒有發現有關我的問題的任何有用信息。將** Catch **定義爲接口庫並將其作爲依賴項添加到** target_link_libraries **中是沒有意義的,因爲** Catch **是僅頭的庫,不需要單獨的構建和鏈接。儘管如此,我試了一下,這並沒有改變任何東西。 – bobeff

+0

@bobeff您是否嘗試在新的CMake環境中*從零開始創建一個捕獲單元測試項目?使用精確的指令?也許它會幫助你找到確切的問題,因爲目前沒有足夠的信息。從頭開始做可能會幫助你找到一個突破的步驟。 –