Hello!
I've managed to clone SFML git repo, then build with CMake and compile together with examples. All examples are working, no errors were detected. Then, I wrote a simple HelloWorld project using locally-built SFML lib, but when I compile it, I get 10 unresolved externals. All of them refer to system-specific functions implemented in sf::priv namespace. Could you help me to fix it? I have no clues what's wrong...
My environment: Windows 10, CMake 3.14.1, MSVC 16 2019.
My folder structure:
* cloned SFML project: D:\Work\SFML ;
* HelloWorld project: D:\Work\TestSFML ;
* content of TestSFML folder: CMakeLists.txt, Initialize3rdparty.sh (copies SFML lib and headers), src\HelloWorld\main.cpp .
CMakeLists.txt:
cmake_minimum_required ( VERSION 2.8 )
project (TestSFML)
set ( EXECUTABLE_NAME HelloWorld )
file ( GLOB SOURCE_FILES "src/${EXECUTABLE_NAME}/*.cpp" )
file ( GLOB HEADER_FILES "src/${EXECUTABLE_NAME}/*.h" )
add_executable ( ${EXECUTABLE_NAME} ${SOURCE_FILES} ${HEADER_FILES} )
set_target_properties ( ${EXECUTABLE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin )
target_include_directories ( ${EXECUTABLE_NAME}
PUBLIC 3rdparty/SFML/include
)
target_link_libraries( ${EXECUTABLE_NAME}
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Debug/sfml-audio-s-d.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Release/sfml-audio-s.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Debug/sfml-graphics-s-d.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Release/sfml-graphics-s.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Debug/sfml-main-d.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Release/sfml-main.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Debug/sfml-network-s-d.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Release/sfml-network-s.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Debug/sfml-system-s-d.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Release/sfml-system-s.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Debug/sfml-window-s-d.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/lib/Release/sfml-window-s.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/flac.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/flac.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/freetype.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/freetype.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/ogg.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/ogg.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/openal32.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/openal32.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/vorbis.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/vorbis.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/vorbisenc.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/vorbisenc.lib
debug ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/vorbisfile.lib optimized ${PROJECT_SOURCE_DIR}/3rdparty/SFML/extlib/vorbisfile.lib
)
add_definitions ( -D SFML_STATIC )
add_definitions ( -D _CRT_SECURE_NO_DEPRECATE )
add_definitions ( -D _SCL_SECURE_NO_WARNINGS )
Initialize3rdparty.sh:
PATH_TO_SFML="../SFML"
mkdir 3rdparty
mkdir 3rdparty/SFML
mkdir 3rdparty/SFML/include
cp -R $PATH_TO_SFML/include/. 3rdparty/SFML/include/
mkdir 3rdparty/SFML/lib
cp -R $PATH_TO_SFML/build/lib/. 3rdparty/SFML/lib/
mkdir 3rdparty/SFML/extlib
cp -R $PATH_TO_SFML/extlibs/libs-msvc/x64/. 3rdparty/SFML/extlib/
src\HelloWorld\main.cpp:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(640, 480), "SFML Application");
sf::CircleShape shape;
shape.setRadius(40.f);
shape.setPosition(100.f, 100.f);
shape.setFillColor(sf::Color::Cyan);
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();
}
}
MSVC build output:
1>------ Build started: Project: HelloWorld, Configuration: Release x64 ------
1>main.cpp
1>D:\Work\TestSFML\3rdparty\SFML\include\SFML/Config.hpp(44,1): warning C4005: 'SFML_SYSTEM_WINDOWS': macro redefinition
1>D:\Work\TestSFML\src\HelloWorld\main.cpp : message : see previous definition of 'SFML_SYSTEM_WINDOWS'
1>sfml-window-s.lib(WglContext.obj) : error LNK2019: unresolved external symbol __imp_wglCreateContext referenced in function "private: void __cdecl sf::priv::WglContext::createContext(class sf::priv::WglContext *)" (?createContext@WglContext@priv@sf@@AEAAXPEAV123@@Z)
1>sfml-window-s.lib(WglContext.obj) : error LNK2019: unresolved external symbol __imp_wglDeleteContext referenced in function "public: virtual __cdecl sf::priv::WglContext::~WglContext(void)" (??1WglContext@priv@sf@@UEAA@XZ)
1>sfml-window-s.lib(WglContext.obj) : error LNK2019: unresolved external symbol __imp_wglGetProcAddress referenced in function "public: static void (__cdecl*__cdecl sf::priv::WglContext::getFunction(char const *))(void)" (?getFunction@WglContext@priv@sf@@SAP6AXXZPEBD@Z)
1>sfml-window-s.lib(WglContext.obj) : error LNK2019: unresolved external symbol __imp_wglMakeCurrent referenced in function "public: virtual __cdecl sf::priv::WglContext::~WglContext(void)" (??1WglContext@priv@sf@@UEAA@XZ)
1>sfml-window-s.lib(WglContext.obj) : error LNK2019: unresolved external symbol __imp_wglShareLists referenced in function "private: void __cdecl sf::priv::WglContext::createContext(class sf::priv::WglContext *)" (?createContext@WglContext@priv@sf@@AEAAXPEAV123@@Z)
1>sfml-window-s.lib(JoystickImpl.obj) : error LNK2019: unresolved external symbol __imp_joyGetPosEx referenced in function "public: static void __cdecl sf::priv::JoystickImpl::initialize(void)" (?initialize@JoystickImpl@priv@sf@@SAXXZ)
1>sfml-window-s.lib(JoystickImpl.obj) : error LNK2019: unresolved external symbol __imp_joyGetDevCapsW referenced in function "public: bool __cdecl sf::priv::JoystickImpl::open(unsigned int)" (?open@JoystickImpl@priv@sf@@QEAA_NI@Z)
1>sfml-system-s.lib(SleepImpl.obj) : error LNK2019: unresolved external symbol __imp_timeGetDevCaps referenced in function "void __cdecl sf::priv::sleepImpl(class sf::Time)" (?sleepImpl@priv@sf@@YAXVTime@2@@Z)
1>sfml-system-s.lib(SleepImpl.obj) : error LNK2019: unresolved external symbol __imp_timeBeginPeriod referenced in function "void __cdecl sf::priv::sleepImpl(class sf::Time)" (?sleepImpl@priv@sf@@YAXVTime@2@@Z)
1>sfml-system-s.lib(SleepImpl.obj) : error LNK2019: unresolved external symbol __imp_timeEndPeriod referenced in function "void __cdecl sf::priv::sleepImpl(class sf::Time)" (?sleepImpl@priv@sf@@YAXVTime@2@@Z)
1>D:\Work\TestSFML\bin\Release\HelloWorld.exe : fatal error LNK1120: 10 unresolved externals
1>Done building project "HelloWorld.vcxproj" -- FAILED.
2>------ Skipped Build: Project: ALL_BUILD, Configuration: Release x64 ------
2>Project not selected to build for this solution configuration
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 1 skipped ==========
Thanks!
Ok, I have downloaded SFML binaries (2.5.1 x64 VC15), and changed CMakeLists.txt correspondingly. Now everything works.
That's my new CMakeListst.txt:
cmake_minimum_required ( VERSION 3.1 )
project (TestSFML)
set ( SFML_STATIC_LIBRARIES TRUE )
set ( SFML_DIR "../SFML-2.5.1/lib/cmake/SFML" )
find_package ( SFML COMPONENTS graphics audio REQUIRED )
add_executable ( HelloWorld src/HelloWorld/main.cpp )
target_link_libraries ( HelloWorld sfml-graphics sfml-audio )
However, how can I use SFML lib that is built from currrent git repo?
Also, how can I have Debug and Release versions of SFML for my HelloWorld Debug and Release builds correspondingly?
Thanks!
I've modified CMakeLists.txt in my HelloWorld project once again, and that's how it looks now:
cmake_minimum_required ( VERSION 3.1 )
project (TestSFML)
set ( SFML_STATIC_LIBRARIES TRUE )
set ( SFML_DIR "../SFML/build" )
find_package ( SFML COMPONENTS graphics audio REQUIRED )
add_executable ( HelloWorld src/HelloWorld/main.cpp )
target_link_libraries ( HelloWorld sfml-graphics sfml-audio )
Value SFML_DIR now points to locally built Git repo.
But CMake refuses to build HelloWorld project, and shows this output:
CMake Error at D:/Work/SFML/build/SFMLConfig.cmake:139 (message):
SFML found but some of its dependencies are missing ( FreeType OpenAL
VorbisFile VorbisEnc Vorbis Ogg FLAC)
Call Stack (most recent call first):
CMakeLists.txt:5 (find_package)
CMake Error at CMakeLists.txt:5 (find_package):
Found package configuration file:
D:/Work/TestSFML/../SFML/build/SFMLConfig.cmake
but it set SFML_FOUND to FALSE so package "SFML" is considered to be NOT
FOUND.
Configuring incomplete, errors occurred!
See also "D:/Work/TestSFML/build/CMakeFiles/CMakeOutput.log".
Any guesses what should I change now?
Thanks!