【问题标题】:How to run SFML in CLion, Error undefined reference to?如何在 CLion 中运行 SFML,错误未定义引用?
【发布时间】:2014-12-23 12:16:50
【问题描述】:

我是 C++ 新手并尝试学习游戏编程,我选择 SFML 并在 Jetbrain 的 CLion 上运行并使用 Ubuntu 机器。我按照本教程SFML and Linux 在这里我的代码:

#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;
}

当我在 CLion 上运行时出错

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()'

我如何配置或设置在 CLion 中运行 SFML,我不知道 CMAKE 可以做到吗?我只通过终端运行,运行这个命令就可以了。

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

如何在终端中每次都配置使用所有引用变量而无需手动操作?谢谢。

【问题讨论】:

    标签: c++ gcc cmake sfml clion


    【解决方案1】:

    阅读@Stackia 建议后。这是我的解决方案参考本教程Tutorial: Build your SFML project with CMake

    1. 创建一个cmake_modules文件夹并下载这个文件FindSFML.cmake并复制进去。

    2. 编辑CMakeLists.txt,将其添加到结束文件,点击重新加载更改。


    # 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. 现在您可以选择 Executable Name MySFML 并单击 Run (Shift+F10)。这行得通!

    【讨论】:

    • 我还要添加${SFML_DEPENDENCIES}。链接共享时它不会做任何事情(坏),并且会在切换到静态链接时自动添加所有 SFML 的依赖项。
    【解决方案2】:

    您需要在 CMakeLists.txt 中链接 SFML 库。

    看看 CMake target_link_libraries

    this link 可能有助于您了解如何在 CMake 中查找 SFML 库路径。

    这是一个 FindSFML.cmake 模块:https://github.com/LaurentGomila/SFML/blob/master/cmake/Modules/FindSFML.cmake

    【讨论】:

    • 谢谢,我去看看。
    • 我只是看到我不小心登录了另一个帐户。这个问题是我创建的,在阅读了您的建议后,我尝试修复它并且它工作完美,谢谢。
    【解决方案3】:

    我已通过以下步骤修复它:

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

      并将其解压到我的项目文件夹中:

      /home/user/ClionProjects/CPP_first/
      
    2. 命名项目“CPP_first”

    3. main.cpp 包含以下内容

      #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 包含以下内容:

      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. 我的项目路径/home/user/ClionProjects/CPP_first/

    PS:安装SFML的时候没找到怎么找:

    sudo apt-get install libsfml-dev
    

    希望对大家有所帮助

    【讨论】:

      【解决方案4】:

      现在这变得简单多了(参见SFML forum discussion)。 这就是我为使我的 sfml 项目在 clion 中运行所做的:

      1. C:\SFML\bin 添加到我的环境变量Path
      2. 修改了我的clion项目的CMakeLists.txt

        cmake_minimum_required(VERSION 3.13)
        project(Hello_SFML)
        
        set(CMAKE_CXX_STANDARD 14)
        
        find_package(SFML 2.5 COMPONENTS graphics audio REQUIRED)
        add_executable(Hello_SFML main.cpp)
        target_link_libraries(Hello_SFML sfml-graphics sfml-audio)
        

      【讨论】:

      • 这在 Linux 上运行良好。 SFML 与sudo apt install libsfml-dev 一起安装。在 Linux 上,您甚至不需要第 1 步。
      【解决方案5】:

      如果您通过以下方式安装 SFML:

      sudo apt-get install libsfml-dev
      

      您将在 /usr/share/SFML/ 中找到路径

      【讨论】:

        猜你喜欢
        • 2020-06-20
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 2023-04-05
        • 2012-09-20
        • 2013-12-26
        相关资源
        最近更新 更多