0

I am trying to use SDL_ttf in CLion on Windows to display text on screen within a game loop. I don't have any issues with standard SDL, which I installed in C:/Programs/SDL/SDL2-2.30.2 (original download file was SDL2-devel-2.30.6-mingw.zip) I also downloaded SDL-TTF into the same location: C:/Programs/SDL/SDL2_ttf-2.22.0 (original download file was SDL2_ttf-devel-2.22.0-mingw.zip) My CMakeLists.txt file contains the following:

cmake_minimum_required(VERSION 3.28)
project(MyProject)

set(CMAKE_CXX_STANDARD 17)

find_package(SDL2 REQUIRED)
find_package(SDL2_ttf REQUIRED)

message(STATUS "SDL2_LIBRARIES = " ${SDL2_LIBRARIES})  # SDL2::SDL2mainSDL2::SDL2

add_executable(MyProject main.cpp
        ...)


include_directories("C:/Program Files/SDL/SDL2_ttf-2.22.0/x86_64-w64-mingw32/include/SDL2")
target_link_libraries(MyProject "C:/Program Files/SDL/SDL2_ttf-2.22.0/x86_64-w64-mingw32/lib/libSDL2_ttf.a")

target_link_libraries(MyProject ${SDL2_LIBRARIES} ${SDL2_TTF_LIBRARIES})

This builds without any errors. I can also include #include "SDL_ttf.h" in my main.cpp file without getting errors. The problem occurs, when I try to actually load a font within my game loop:

...
while (true) {
  TTF_Font* font = TTF_OpenFont("C:/Windows/Fonts/arial.ttf", 24);  // Leads to error
}

The error is the following:

C:\Program Files\JetBrains\CLion 2024.1\bin\mingw\bin/ld.exe: C:/Program Files/SDL/SDL2_ttf-2.22.0/x86_64-w64-mingw32/lib/libSDL2_ttf.a(libSDL2_ttf_la-hb-uniscribe.o): in function `_hb_generate_unique_face_name':
/Users/valve/release/SDL2_ttf/SDL2_ttf-2.22.0-source/foo-x64/../external/harfbuzz/src/hb-uniscribe.cc:300: undefined reference to `__imp_UuidCreate'

Did I set my CMake file up incorrectly? Are there other issues within my approach? Am I missing any downloads?

Thank you in advance!

When I just define the command TTF_Font* font there seems to be no problem and the game runs fine. So the problem seems to be with the TTF_OpenFont(...) function.

I also tried to change the CMake file to use .dll files:

include_directories("C:/Program Files/SDL/SDL2_ttf-2.0.12/include")
target_link_libraries(MyProject "C:/Program Files/SDL/SDL2_ttf-2.0.12/lib/x86/SDL2_ttf.dll")

This changes the error to undefined reference to TTF_OpenFont'`

1
  • 1
    Can you instead link SDL2_ttf::SDL2_ttf or SDL2_ttf::SDL2_ttf-static target instead of SDL2_TTF_LIBRARIES ? Not sure how that variable works for imported targets, you are also using two different targets one static and one dynamuc ... not sure how that works either. Commented Oct 24, 2024 at 10:07

1 Answer 1

0

The release you downloaded ships with a CMake config file, which means that find_package(SDL2_ttf REQUIRED) defines a target called SDL2_ttf::SDL2_ttf that you can just link.

Crucially, this target sets up the include directories, location of the file to link, and some extra dependency libraries that you forgot:

set(_sdl2ttf_extra_static_libraries " -lusp10 -lgdi32 -lrpcrt4  -lusp10 -lgdi32 -lrpcrt4")

That means you do not have to call include_directories for SDL2_ttf or link directly to the DLL, you can just do:

target_link_libraries(MyProject SDL2_ttf::SDL2_ttf SDL2::SDL2)

as SDL2 exports a similar CMake target.

Sign up to request clarification or add additional context in comments.

2 Comments

This works for me! However I had to change target_link_libraries(...) to target_link_libraries(MyProject SDL2_ttf::SDL2_ttf SDL2::SDL2main SDL2::SDL2). It was missing the SDL2::SDL2main command.
Yes, that's a windows-specific thing. I have repressed that memory :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.