【问题标题】:SFML not found - CLion/Cmake未找到 SFML - CLion/Cmake
【发布时间】:2015-10-19 15:18:19
【问题描述】:

我基本上是在尝试在使用 CMake 的 CLion 中创建一个 SFML 项目。

我首先下载了 SFML 2.2,它已经构建了 .dylib 文件。上面说要安装在usr/local/libusr/local/include,但是它们不存在,所以我创建了它们,然后把文件放在那里。

然后我打开 CLion,创建了一个子目录 cmake_modules,将 FindSFML.cmake 文件放在里面,并在根项目目录中放置了这些文件:

main.cpp

#include <SFML/Graphics.hpp>

int main()
{
    sf::err() << "Hello, World!" << std::endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.2)
project(HelloWorld)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(HelloWorld ${SOURCE_FILES})

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH})

find_package(SFML COMPONENTS graphics window system REQUIRED)
include_directories(${SFML_INCLUDE_DIR})

target_link_libraries(HelloWorld ${SFML_Libraries})

问题是当我尝试构建项目时,出现以下错误:

Undefined symbols for architecture x86_64:
  "sf::err()", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我已尝试寻找解决方案,但它们似乎都不起作用。我是不是把文件放错了地方,还是忘记了一些导入 CMake 设置?我知道使用 Xcode 设置 SFML 会更容易,但如果可能的话,我更喜欢使用 CLion。

【问题讨论】:

  • @Tsyvarev 该链接并没有真正帮助,我在这里找到了另一个:goobbe.com/questions/4676434/… 并准确复制了底部的 makefile 配置,但现在它显示为 fatal error: 'SFML/Graphics.hpp' file not found
  • 哦,上面还写着make[3]: *** No rule to make target /Users/Rutvik/Downloads/SFML-2.3/lib/libsfml-system.dylib

标签: c++ cmake sfml clion


【解决方案1】:

好的,所以我创建了一个全新的项目,在我的终端上运行 xcode-select --install 以使 /usr/local/ 成为编译器搜索的目录,下载 SFML 2.3 而不是 2.2,决定使用随附的 FindSFML.cmake 文件使用 SFML,并让我的CmakeLists.txt 文件看起来像这样:

cmake_minimum_required(VERSION 3.2)
project(SFMLTest)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(SFMLTest ${SOURCE_FILES})

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "~/SFML-2.3/cmake/Modules/")
find_package(SFML REQUIRED graphics window system)
if (SFML_FOUND)
    include_directories(${SFML_INCLUDE_DIR})
    target_link_libraries(SFMLTest ${SFML_LIBRARIES})
endif(SFML_FOUND)

这在 CLion 中编译并运行了以下代码:

#include <iostream>
#include <SFML/Graphics.hpp>

using namespace std;

int main()
{
    sf::RenderWindow window(sf::VideoMode(640, 480), "Window");

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

        window.clear();
        window.display();
    }
    return 0;
}

我不知道究竟是什么解决了所有问题,但我很高兴它解决了。希望这可以帮助其他陷入类似困境的人。

【讨论】:

    【解决方案2】:

    对于 SFML 2.5 及更高版本,采用了更现代的方法,并且设置 cmake 更容易。

    CMakeLists.txt 示例

    cmake_minimum_required(VERSION 3.1)
    
    project(SFMLTest)
    
    find_package(SFML 2.5 COMPONENTS graphics audio REQUIRED)
    add_executable(SFMLTest main.cpp)
    target_link_libraries(SFMLTest sfml-graphics sfml-audio)
    

    注意:

    不再需要设置 FindSFML.cmake 或 SFML_ROOT 等。

    SFML_LIBRARIES、SFML_DEPENDENCIES 和 SFML_INCLUDE_DIR 不存在 没有了

    更多信息https://en.sfml-dev.org/forums/index.php?topic=24070.0

    【讨论】:

      【解决方案3】:

      对于通过 brew 下载 SFML 的其他人,我设法通过将其添加到我的 CMakeLists.txt 来解决此问题

      set(SFML_ROOT /usr/local/lib)
      

      【讨论】:

      • 我被这个卡住了,我通过 brew 下载了 SFML,有什么帮助吗?
      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 2015-03-30
      • 2022-09-27
      • 2019-01-19
      • 2021-07-08
      • 2021-03-06
      • 1970-01-01
      相关资源
      最近更新 更多