2017-06-21 3 views
2

Ich migriere einige Projekte, um CMake Build-System zu verwenden. Jetzt füge ich Projekt mit einigen Einheitentests unter Verwendung der Catch Bibliothek hinzu. Es ist nur eine Header-Bibliothek. Das alte Visual Studio Projekt baut gut, aber das neue CMake Projekt gibt ungelösten externen Symbol Linker-Fehler. Ich habe CATCH_CONFIG_MAIN in einer meiner Quelldateien definiert. Es werden alle cpp Dateien aus anderen Projekten hinzugefügt, die für die Tests benötigt werden, und alle Bibliotheken, von denen andere getestete Projekte abhängen, sind verknüpft. Trotzdem habe ich nicht aufgelöstes externes Symbol Fehler nur mit von CMake Projekt generiert:Nicht aufgelöstes externes Symbol mit Catch-Bibliothek

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) 

Offensichtlich fehlt mir etwas Konfiguration von vcxproj zu CMakeLists.txt hinzufügen, aber ich bin derzeit kann es nicht herausgefunden.

+0

Sie vermissen offensichtlich einige Catch-Bibliotheken. Wenn Sie sie im Linker-Abschnitt Ihres VS-Projekts nicht finden können; Versuchen Sie dann, in den Kopfzeilen von Catch nach '#pragma comment (lib," name-of-catch-library ") zu suchen, was dazu führt, dass die benannte Bibliothek automatisch vom Linker übernommen wird. –

+1

@Richard Critten Wie gesagt, die Fangbibliothek ist nur Header und es gibt keine ** libs ** dafür. – bobeff

+2

Haben Sie "offizielle" Anweisungen für die CMake-Integration verwendet? https://github.com/philesquared/Catch/blob/master/docs/build-systems.md (siehe Abschnitt CMake) –

Antwort

1

In einer meiner Dateien habe ich:

#define CATCH_CONFIG_MAIN 
#include <catch.hpp> 

aber ich auch mit CMake Makro zum Hinzufügen vorkompilierte Header zum Projekt:

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

Dieses Makro enthält gewaltsam vorkompilierte Header in allen Dateien, aber ich habe #include <catch.hpp> ohne #define CATCH_CONFIG_MAIN, die von allen Dateien außer einem benötigt wird.

Ich habe eine Option zum Makro hinzugefügt, um eine Liste von Dateien zu übergeben, in denen der vorkompilierte Header nicht enthalten sein soll, und das behebt das Problem.

1

Es ist ein wenig schwierig, ein konkretes Problem aus dem von Ihnen angegebenen Kontext abzuleiten, aber here ist eine offizielle Catch-Anweisung für die CMake-Integration.

Nach meiner Erfahrung mit Visual Studio - Integration lief reibungslos.

+0

+1 Danke, dass Sie mich auf die offizielle ** Catch ** Dokumentation über die ** CMake ** Integration hingewiesen haben, aber ich habe dort nichts Nützliches zu meinem Problem gefunden. Das Definieren von ** Catch ** als Interface-Bibliothek und das Hinzufügen als Abhängigkeit in ** target_link_libraries ** ist sinnlos, da ** Catch ** nur eine Header-Bibliothek ist und kein separates Build und Linking erforderlich ist. Trotzdem habe ich es probiert und daran hat sich nichts geändert. – bobeff

+0

@bobeff Haben Sie versucht, ein Catch-Unit-Testprojekt in Ihrer neuen CMake-Umgebung zu erstellen * von Grund auf * mit genauen Anweisungen? Vielleicht wird es Ihnen helfen, das genaue Problem zu finden, weil es zur Zeit nicht genug Informationen gibt. Und es von Grund auf neu zu machen kann Ihnen helfen, einen Schritt zu finden, wo es bricht. –

Verwandte Themen