2017-06-29 3 views
0

Ich habe einen Code mit mehreren Dateien, die die GSL-Bibliothek verwendet. Wenn ich den Code über das Terminal mit dem Befehl kompilierenVerknüpfen von GSL in Cmakelists.txt in CLion

Dies kompiliert und gibt die richtige Ausgabe und keine Fehler. Allerdings, wenn ich den Code in CLION versuchen und bauen ich den Fehler

undefined reference to `gsl_rng_uniform' 

ich die verschiedenen CPP-Dateien in meinem Code durch den CMakeLists.txt verknüpft haben, aber ich denke, muss ich etwas ähnliches die Fahnen, die mit GSL verlinkt werden sollen. Meine CMakeLists.txt Datei wird als zur Zeit folgt (nur die CPP-Dateien werden in den Quelldateien enthält, nicht die H-Dateien):

cmake_minimum_required(VERSION 3.7) 
project(Unitsv1) 

set(CMAKE_CXX_STANDARD 11) 

set(SOURCE_FILES main.cpp 
       transition.cpp 
       random.cpp) 
add_executable(Unitsv1 ${SOURCE_FILES}) 

Ich bin sehr neu in C++, und kann nicht scheinen, um online Antworten zu finden. Danke

+1

Anfügen diesen Befehl, um Ihre CMakeLists.txt target_link_libraries (Unitsv1 gsl) – Misgevolution

+0

Mögliches Duplikat von [Was ist ein nicht definierter Verweis/ungelöster externer Symbolfehler und wie behebe ich ihn?] (Https: // stac koverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – arrowd

+0

muss aber sicherstellen, dass es im Suchpfad ist. https://cmake.org/cmake/help/v3.0/command/link_directories.html – xaxxon

Antwort

5

Sie haben nicht in den GSL-Bibliotheken verknüpft, so dass der Linker keines der von ihm bereitgestellten Symbole finden wird. So etwas sollte man die meisten der Weg dorthin:

cmake_minimum_required(VERSION 3.7) 
project(Unitsv1) 

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_STANDARD_REQUIRED YES) # See below (1) 

set(SOURCE_FILES main.cpp 
       transition.cpp 
       random.cpp) 
add_executable(Unitsv1 ${SOURCE_FILES}) 

find_package(GSL REQUIRED) # See below (2) 
target_link_libraries(Unitsv1 GSL::gsl GSL::gslcblas) 

Wenn Ihr Code C++ 11 verwendet, dann müssen Sie die Zeile an (1) Sie, um sicherzustellen, tatsächlich bekommen C++ 11-Unterstützung. Ohne CMAKE_CXX_STANDARD_REQUIRED YES fungiert die Variable CMAKE_CXX_STANDARD nur als "Verwenden Sie sie, wenn sie verfügbar ist, oder greifen Sie auf den nächsten Standard zurück, den der Compiler bereitstellen kann". Wenn Sie neugierig sind, finden Sie eine detaillierte Beschreibung here.

Der wichtigere Teil für Ihre Frage ist bei (2). Der Befehl find_package() sucht nach den GSL-Bibliotheken usw. und stellt sie als Importziele GSL::gsl und GSL::gslcblas zur Verfügung. Sie verwenden dann target_link_libraries(), um Ihre ausführbare Datei wie abgebildet mit ihnen zu verknüpfen. Die CMake Dokumentation erklärt, wie die find_package() Seite der Dinge in viel Detail funktioniert:

+0

So include_directories hinzufügen ich hatte ($ {GSL_INCLUDE_DIR}) aber dann funktionierte es! Vielen Dank. – Kahealani

+0

Das ist seltsam. Für das Importziel 'GSL :: gsl' ist die Eigenschaft 'INTERFACE_INCLUDE_DIRECTORIES' bereits auf den Inhalt von 'GSL_INCLUDE_DIRS' gesetzt, was nicht notwendig gewesen wäre. –