2014-10-28 15 views
5

Ich bin neu in C++ und versuche, Spielprogrammierung zu lernen, ich wähle SFML und laufen auf CLion von Jetbrain und Ubuntu-Maschine. Ich nach diesem Tutorial SFML and Linux hier mein Code:Wie SFML in CLion ausführen, Fehler undefinierter Verweis auf?

#include <SFML/Graphics.hpp> 

using namespace sf; 

int main() { 

RenderWindow window(sf::VideoMode(200, 200), "SFML Work!"); 
CircleShape shape(100.f); 
shape.setFillColor(Color::Green); 

while (window.isOpen()) { 
    Event event; 
    while (window.pollEvent(event)) { 
     if (event.type == Event::Closed) { 
      window.close(); 
     } 
    } 

    window.clear(); 
    window.draw(shape); 
    window.display(); 
} 

return 0; 
} 

Wenn ich auf CLION laufen Fehler es

CMakeFiles/SFMLBasic.dir/main.cpp.o: In function `main': 
undefined reference to `sf::String::String(char const*, std::locale const&)' 
undefined reference to `sf::VideoMode::VideoMode(unsigned int, unsigned int, unsigned int)' 
undefined reference to `sf::RenderWindow::RenderWindow(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&)' 
... 
undefined reference to `sf::Shape::~Shape()' 

Wie ich Config oder Setup SFML in CLION laufen, ich weiß nicht, CMAKE tun können, ? Ich laufe nur nach Terminal, Es funktioniert, wenn ich diesen Befehl ausführen.

g++ -c main.cpp 
g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system 
./sfml-app 

Wie config alle Bezugsgröße zu verwenden, ohne im Terminal jedes Mal manuell tun? Vielen Dank.

Antwort

2

Sie müssen die SFML-Bibliothek in Ihrer CMakeLists.txt verlinken.

Werfen Sie einen Blick auf CMake target_link_libraries.

Und this link möglicherweise hilfreich für Sie zu wissen, wie SFML Bibliothekspfad in CMake zu finden.

ist hier ein FindSFML.cmake Modul: https://github.com/LaurentGomila/SFML/blob/master/cmake/Modules/FindSFML.cmake

+0

Dank helfen wird, werde ich check it out. – Phonbopit

+0

Ich sehe gerade, dass ich versehentlich ein anderes Konto anmelde. Diese Frage wurde von mir erstellt, nachdem ich Ihren Vorschlag gelesen habe, versuche ich zu beheben und es funktioniert perfekt, Danke. – Phonbopit

6

Nach gelesen @Stackia Vorschlag. Dies ist meine Lösung für dieses Tutorial finden Tutorial: Build your SFML project with CMake

  1. erstellen cmake_modules Ordner und diese Datei herunterladen FindSFML.cmake und kopieren Sie in ihm.

  2. Bearbeiten Sie CMakeLists.txt, indem Sie dies zur Enddatei hinzufügen, klicken Sie auf Änderungen neu laden.


# Define sources and executable set(EXECUTABLE_NAME "MySFML") add_executable(${EXECUTABLE_NAME} main.cpp)

# Detect and add SFML 
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH}) 
find_package(SFML 2 REQUIRED system window graphics network audio) 
if(SFML_FOUND) 
    include_directories(${SFML_INCLUDE_DIR}) 
    target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES}) 
endif() 

  1. Jetzt können Sie MySFML Namen der ausführbaren Datei auswählen und klicken Sie auf Ausführen (Shift + F10). Es funktioniert! enter image description here
+0

Ich würde auch '$ {SFML_DEPENDENCIES}' hinzufügen. Es wird nichts (schlechtes) beim Verknüpfen von shared machen und fügt automatisch alle Abhängigkeiten von SFML hinzu, wenn auf die statische Verknüpfung umgeschaltet wird. – Lukas

2

Ich habe es mit folgenden Schritten festgelegt:

  1. Herunterladen http://www.sfml-dev.org/download/sfml/2.3.2/64-Linux

    Und es in Ordnern mit meinem Projekt extrahieren:

    /home/user/ClionProjects/CPP_first/ 
    
  2. Named-Projekt " CPP_first "

  3. main.cpp enthält folgende

    #include <SFML/Graphics.hpp> 
    
    int main() 
    { 
        sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); 
        sf::CircleShape shape(100.f); 
        shape.setFillColor(sf::Color::Green); 
    
        while (window.isOpen()) 
        { 
         sf::Event event; 
         while (window.pollEvent(event)) 
         { 
          if (event.type == sf::Event::Closed) 
           window.close(); 
         } 
    
         window.clear(); 
         window.draw(shape); 
         window.display(); 
        } 
    
        return 0; 
    } 
    
  4. CMakeLists.txt enthalten folgende:

    set(EXECUTABLE_NAME "CPP_first") 
    add_executable(${EXECUTABLE_NAME} main.cpp) 
    
    
    # Detect and add SFML 
    set(SFML_DIR "/home/user/ClionProjects/CPP_first/SFML-2.3.2/share/SFML/cmake/Modules") 
    set(CMAKE_MODULE_PATH "/home/user/ClionProjects/CPP_first/SFML-2.3.2/share/SFML/cmake/Modules" ${CMAKE_MODULE_PATH}) 
    find_package(SFML REQUIRED system window graphics network audio) 
    if(SFML_FOUND) 
        include_directories(${SFML_INCLUDE_DIR}) 
        target_link_libraries(${EXECUTABLE_NAME} ${SFML_LIBRARIES}) 
    endif() 
    
  5. Weg zu meinem Projekt /home/user/ClionProjects/CPP_first/

PS: Ich habe nicht finden, wie SFML zu finden wenn es installiert ist von:

sudo apt-get install libsfml-dev 

Ich hoffe, dass es jemand

Verwandte Themen