SFML community forums

Help => General => Topic started by: Saitei on June 23, 2016, 05:39:17 pm

Title: [CMake]Could NOT find SFML
Post by: Saitei on June 23, 2016, 05:39:17 pm
Quote
cmake_minimum_required(VERSION 2.8)
project(ECS_GameEngine)

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

#aux_source_directory(. SRC_LIST)
set(SRC_LIST ${SRC_LIST} main.cpp entity.h component.cpp system.cpp channel.cpp
    gamestate.h engine.h)
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

add_executable(${PROJECT_NAME} ${SRC_LIST})

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_BINARY_DIR}/deps/SFML-2.3.2/cmake/Modules")
set(SFML_ROOT "${CMAKE_BINARY_DIR}/deps/SFML-2.3.2")
set(SFML_STATIC_LIBRARIES TRUE)
find_package(SFML 2 REQUIRED system window graphics network audio)

if(SFML_FOUND)
  include_directories(${SFML_INCLUDE_DIR})
  target_link_libraries(${PROJECT_NAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
endif()

Also I install the following libraries:
Quote
sudo apt-get install libpthread-stubs0-dev
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libx11-dev
sudo apt-get install libxrandr-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libglew1.5-dev
sudo apt-get install libjpeg8-dev
sudo apt-get install libsndfile1-dev
sudo apt-get install libopenal-dev
sudo apt-get install cmake
sudo apt-get install g++

Error:
Quote
/home/saitei/Projects/ECS_GameEngine/deps/SFML-2.3.2/cmake/Modules/FindSFML.cmake:358: ошибка: Could NOT find SFML (missing: SFML_SYSTEM_LIBRARY SFML_WINDOW_LIBRARY SFML_GRAPHICS_LIBRARY SFML_NETWORK_LIBRARY SFML_AUDIO_LIBRARY) CMakeLists.txt:23 (find_package)


How can I fix this problem?
Title: Re: [CMake]Could NOT find SFML
Post by: Saitei on June 23, 2016, 05:40:37 pm
Oh! My bad, sorry!
Quote
find_package(SFML 2 COMPONENTS system window graphics network audio)


Hm... But my problem still actual:
Quote
18:56:56: Выполняются этапы для проекта ECS_GameEngine...
18:56:56: Запускается: «/usr/bin/cmake» --build . --target all
Linking CXX executable /home/saitei/Projects/ECS_GameEngine/bin/ECS_GameEngine
CMakeFiles/ECS_GameEngine.dir/main.cpp.o: In function `main':
main.cpp:(.text.startup+0x4b): undefined reference to `sf::String::String(char const*, std::locale const&)'
main.cpp:(.text.startup+0x64): undefined reference to `sf::VideoMode::VideoMode(unsigned int, unsigned int, unsigned int)'
main.cpp:(.text.startup+0x87): undefined reference to `sf::Window::Window(sf::VideoMode, sf::String const&, unsigned int, sf::ContextSettings const&)'
main.cpp:(.text.startup+0xae): undefined reference to `sf::Window::isOpen() const'
main.cpp:(.text.startup+0xd3): undefined reference to `sf::Window::pollEvent(sf::Event&)'
main.cpp:(.text.startup+0xe1): undefined reference to `sf::Window::display()'
main.cpp:(.text.startup+0xf6): undefined reference to `sf::Window::close()'
main.cpp:(.text.startup+0x102): undefined reference to `sf::Window::~Window()'
main.cpp:(.text.startup+0x13d): undefined reference to `sf::Window::~Window()'
collect2: error: ld returned 1 exit status
make[2]: *** [/home/saitei/Projects/ECS_GameEngine/bin/ECS_GameEngine] Error 1
make[1]: *** [CMakeFiles/ECS_GameEngine.dir/all] Error 2
make: *** [all] Error 2
18:56:56: Процесс «/usr/bin/cmake» завершился с кодом 2.
Ошибка при сборке/установке проекта ECS_GameEngine (комплект: Desktop Qt 5.6.0 GCC 64bit)
Во время выполнения этапа «Сборка»
18:56:56: Прошло времени: 00:00.

#include <SFML/Graphics.hpp>

int main(int argc, char* argv[])
{
  sf::Window App(sf::VideoMode(800, 600), "myproject");

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

Quote
cmake_minimum_required(VERSION 2.8)
project(ECS_GameEngine)

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

set(SRC_LIST ${SRC_LIST} main.cpp entity.h component.cpp system.cpp channel.cpp
    gamestate.h engine.h)
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

set(SFML_ROOT "${CMAKE_BINARY_DIR}/deps/SFML-2.3.2")
set(SFML_STATIC_LIBRARIES TRUE)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_BINARY_DIR}/deps/SFML-2.3.2/cmake/Modules")
find_package(SFML 2 COMPONENTS system window graphics network audio)

include_directories(${SFML_INCLUDE_DIR})
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
Title: Re: [CMake]Could NOT find SFML
Post by: Saitei on June 23, 2016, 10:44:06 pm
Can anyone help me, please? :(
Title: AW: [CMake]Could NOT find SFML
Post by: eXpl0it3r on June 24, 2016, 08:33:10 am
The libraries aren't getting linked, not sure why though. You could rub make with the verbose output and look at the build commands used by CMake.
Title: Re: [CMake]Could NOT find SFML
Post by: SeriousITGuy on June 27, 2016, 09:17:44 am
As far as I can see, you try to link statically, so you need the static libs. Check if they are present in your SFML directory (e.g. libsfml-system-s.so) because on Linux the default SFML package does not supply the static libs (because that is not how one links on Linux). You can build them yourself from source if you really need them, that is no big hassle. But I strongly recommend using the dynamic libs on *nix OS'es and then supply them alongside your binary and set LD_LIBRARY_PATH via a start script.
Title: Re: [CMake]Could NOT find SFML
Post by: Limeoats on June 28, 2016, 03:29:23 pm
You shouldn't need to use COMPONENTS. I simply have this for the SFML code in my CMakeLists.txt

Quote
include(FindPkgConfig)
find_package(SFML REQUIRED system window graphics network audio)
include_directories(${SFML_INCLUDE_DIR})
if(WIN32)
    target_link_libraries(${PROJECT_NAME} ${SFML_LIBRARIES} -lmingw32 -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid)
else()
    target_link_libraries(${PROJECT_NAME} ${SFML_LIBRARIES}  )
endif()

This works on both Windows and Mac.

Of course, you need FindSFML.cmake to use this, but I assume you already are since it seems to be including fine (just the linking is the problem).