1

Тема: Проблеми при додаванні хедерів бібліотеки Freetype

Намагаюся додати до свого проєкту бібліотеку Freetype за допомогою CMake:

cmake_minimum_required(VERSION 3.10)

project(font_extractor
    VERSION 1.0.0
    LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20 )
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_COLOR_DIAGNOSTICS ON)


find_package(freetype)
include_directories(${FREETYPE_INCLUDE_DIRS})


add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} freetype)

# Цією командою можна зручно встановити бажаний стандарт [c++17, c++20, c++23]
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
# Цією командою можна легко додати дефайни, можна вписувати їх на місці
#target_compile_definitions(${PROJECT_NAME} PUBLIC _GLIBCXX_DEBUG)
# Цією командою виставляємо прапорці компілятору
target_compile_options(${PROJECT_NAME}
  PUBLIC   -Wall
           -Wextra
           -Wpedantic
           -fsanitize=address,undefined,leak
           -march=native
           -fno-omit-frame-pointer
           -shared
           -fpic
           -o0
           -ggdb3
           -Wconversion
           -Wl,-z,noexecstack
           -fstack-protector-strong
           -fno-common
         )
# Цією командою виставляємо прапорці лінкеру
target_link_options(${PROJECT_NAME}
  PUBLIC
  -fsanitize=address,undefined,leak
  -g3
  -fno-omit-frame-pointer
  -fno-common
)



if(CMAKE_CXX_COMPILER_LOADED)
     message(STATUS "Compiler path: ${CMAKE_CXX_COMPILER}")
     message(STATUS "Compiler ID: ${CMAKE_CXX_COMPILER_ID}")
     message(STATUS "Compiler version:
             ${CMAKE_CXX_COMPILER_VERSION}")
endif()

set_property(TARGET ${PROJECT_NAME} PROPERTY  CXX_STANDARD 20)

add_custom_command(
    TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND ${PROJECT_NAME}
)

include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

Додаю хедери ось так:

#include <freetype2/ft2build.h>
#include <freetype2/freetype/freetype.h>

Але все одно не працює, видає помилку: In included file: 'ft2build.h' file not found [pp_file_not_found] .

У документації написано, що має бути ось так:

#include <ft2build.h>
#include FT_FREETYPE_H

Якщо так зробити, то все одно не бачить ft2build.h.

Вивід pkg-config --cflags freetype2 ось такий:

-I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/sysprof-6 -pthread

OS Manjaro.
Не розумію, що тут ще можна зробити, щоб запрацювало.

2

Re: Проблеми при додаванні хедерів бібліотеки Freetype

Перше, я б перевірив чи в cmake ім'я бібліотеки правильне, там точно просто freetype, а не freetype2 часом?
Потім я б все ж замінив include_directories на target_include_directories, щось типу такого

target_include_directories(${PROJECT_NAME} PRIVATE ${FREETYPE_INCLUDE_DIRS})

і вставив його після target_link_libraries.

Подякували: Teg Miles, leofun012

3

Re: Проблеми при додаванні хедерів бібліотеки Freetype

wander написав:

Перше, я б перевірив чи в cmake ім'я бібліотеки правильне, там точно просто freetype, а не freetype2 часом?
Потім я б все ж замінив include_directories на target_include_directories, щось типу такого

target_include_directories(${PROJECT_NAME} PRIVATE ${FREETYPE_INCLUDE_DIRS})

і вставив його після target_link_libraries.

Зробив ось так(і з двійкою і без), усе одно не працює:

find_package(freetype2)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} freetype2)
target_include_directories(${PROJECT_NAME} PRIVATE ${FREETYPE2_INCLUDE_DIRS})

4

Re: Проблеми при додаванні хедерів бібліотеки Freetype

Гм, гаразд давайте подивимось, чи cmake взагалі знаходить шляхи директорій, додайте message перед target_include_directories, ось так

message(STATUS "FREETYPE2_INCLUDE_DIRS=${FREETYPE2_INCLUDE_DIRS}")
target_include_directories(${PROJECT_NAME} PRIVATE ${FREETYPE2_INCLUDE_DIRS})

Скажете, що виводить.

Teg Miles написав:

Зробив ось так(і з двійкою і без), усе одно не працює

Спробуйте з двійкою і без теж.

І ще, спробуйте додати C, як мову для проєкту:

project(font_extractor
    VERSION 1.0.0
    LANGUAGES C CXX) # << ось тут

Бо ця бібліотека схоже Сішна.

Подякували: Teg Miles1

5

Re: Проблеми при додаванні хедерів бібліотеки Freetype

wander написав:

Гм, гаразд давайте подивимось, чи cmake взагалі знаходить шляхи директорій, додайте message перед target_include_directories, ось так

message(STATUS "FREETYPE2_INCLUDE_DIRS=${FREETYPE2_INCLUDE_DIRS}")
target_include_directories(${PROJECT_NAME} PRIVATE ${FREETYPE2_INCLUDE_DIRS})

Скажете, що виводить.

Teg Miles написав:

Зробив ось так(і з двійкою і без), усе одно не працює

Спробуйте з двійкою і без теж.

І ще, спробуйте додати C, як мову для проєкту:

project(font_extractor
    VERSION 1.0.0
    LANGUAGES C CXX) # << ось тут

Бо ця бібліотека схоже Сішна.

Ось таке виводить:

-- FREETYPE2_INCLUDE_DIRS=  

А ще є ось такий вивід, не відразу побачив його:

CMake Warning at CMakeLists.txt:17 (find_package):
  By not providing "Findfreetype.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "freetype",
  but CMake did not find one.

  Could not find a package configuration file provided by "freetype" with any
  of the following names:

    freetypeConfig.cmake
    freetype-config.cmake

  Add the installation prefix of "freetype" to CMAKE_PREFIX_PATH or set
  "freetype_DIR" to a directory containing one of the above files.  If
  "freetype" provides a separate development package or SDK, be sure it has
  been installed.

Я замінив FREETYPE2_INCLUDE_DIRS на /usr/include/freetype2,
але все одно не бачить бібліотеки, хоча й компілюється.

6

Re: Проблеми при додаванні хедерів бібліотеки Freetype

Teg Miles написав:

Ось таке виводить

Схоже cmake не знаходить самотужки бібліотеку freetype. Як ви її встановлювали?

Teg Miles написав:

-- FREETYPE2_INCLUDE_DIRS=

А, без 2 у назві все те саме? Типу просто freetype? Уважно перегляньте, чи немає десь міксування з 2 і без.

Teg Miles написав:

А ще є ось такий вивід, не відразу побачив його

Це трохи дивно, зазвичай глобально встановлені бібліотеки cmake знаходить. Таке може бути, якщо шлях до бібліотеки не у стандартних системних шляхах, команда find_package саме їх перевіряє, в убунту це зазвичай типу /usr/local/bin, не певен щодо манджаро.

Отже, подивіться за яким шляхом у вас лежить бібліотека freetype. Якщо вона не у дефолтних системних шляхах у вашій ОС, то можете спробувати symlink'нути туди де потрібно. Якщо це не допоможе, то спробуйте насильно згодувати cmake'у правильний шлях. Спершу потрібно знайти (ґрепнути) freetypeConfig.cmake або freetype-config.cmake, він десь має лежати.

ls /some/path/libs | grep -E "freetype(-?.*)\.cmake" 

Має видати щось типу

/some/path/libs/cmake/freetypeConfig.cmake

Шлях, який нас цікавить ось цей буде /some/path/libs/cmake без freetypeConfig.cmake.
Потім у cmake робите ось так:

SET(CMAKE_FIND_DEBUG_MODE TRUE)
LIST(APPEND CMAKE_MODULE_PATH "/some/path/libs/cmake") # << сюди шлях який ВИ отримаєте з grep

find_package(freetype REQUIRED)

решта скрипта
Подякували: Teg Miles, leofun012

7 Востаннє редагувалося Teg Miles (19.05.2025 14:11:23)

Re: Проблеми при додаванні хедерів бібліотеки Freetype

wander написав:
Teg Miles написав:

Ось таке виводить

Схоже cmake не знаходить самотужки бібліотеку freetype. Як ви її встановлювали?

Teg Miles написав:

-- FREETYPE2_INCLUDE_DIRS=

А, без 2 у назві все те саме? Типу просто freetype? Уважно перегляньте, чи немає десь міксування з 2 і без.

Teg Miles написав:

А ще є ось такий вивід, не відразу побачив його

Це трохи дивно, зазвичай глобально встановлені бібліотеки cmake знаходить. Таке може бути, якщо шлях до бібліотеки не у стандартних системних шляхах, команда find_package саме їх перевіряє, в убунту це зазвичай типу /usr/local/bin, не певен щодо манджаро.

Отже, подивіться за яким шляхом у вас лежить бібліотека freetype. Якщо вона не у дефолтних системних шляхах у вашій ОС, то можете спробувати symlink'нути туди де потрібно. Якщо це не допоможе, то спробуйте насильно згодувати cmake'у правильний шлях. Спершу потрібно знайти (ґрепнути) freetypeConfig.cmake або freetype-config.cmake, він десь має лежати.

ls /some/path/libs | grep -E "freetype(-?.*)\.cmake" 

Має видати щось типу

/some/path/libs/cmake/freetypeConfig.cmake

Шлях, який нас цікавить ось цей буде /some/path/libs/cmake без freetypeConfig.cmake.
Потім у cmake робите ось так:

SET(CMAKE_FIND_DEBUG_MODE TRUE)
LIST(APPEND CMAKE_MODULE_PATH "/some/path/libs/cmake") # << сюди шлях який ВИ отримаєте з grep

find_package(freetype REQUIRED)

решта скрипта

Таких файлів як freetypeConfig.cmake або freetype-config.cmake не існує.
Гадаю, це пов'язано з переходом Manjaro на pkgconfig.

pkg-config --libs freetype2 видає: -lfreetype
Тому двійки не повинно бути.

8

Re: Проблеми при додаванні хедерів бібліотеки Freetype

Тут я вам нічого не підкажу, бо не знайомий ні з Manjaro, ні з pkgconfig.
Можливо найпростішим варіантом буде самому збілдити freetype і тоді всунути в cmake.

9

Re: Проблеми при додаванні хедерів бібліотеки Freetype

wander написав:

Тут я вам нічого не підкажу, бо не знайомий ні з Manjaro, ні з pkgconfig.
Можливо найпростішим варіантом буде самому збілдити freetype і тоді всунути в cmake.

Програма стара, мабуть, автор просто ще не прописав підтримку pkgconfig.
Краще спробую SDL, там є додаток SDL_ttf, який має робити все те, що й freetype.

10

Re: Проблеми при додаванні хедерів бібліотеки Freetype

Виявляється в find_packages треба було писати з великої літери Freetype.
Якщо записати як find_packages(Freetype), то ось такий вивід отримується:

Found Freetype: /usr/lib/libfreetype.so (found version "2.13.3")             │                                                                                           
 -- FREETYPE_INCLUDE_DIRS=/usr/include/freetype2                                 │                                                                                           
 -- FREETYPE_FOUND=TRUE  

Тобто CMake все знаходить, але тут інша проблема,
треба щоб include був такий:

#include <ft2build.h> 

А він ось такий, інакше взагалі не бачить:

#include <freetype2/ft2build.h> 

Чи можна якось назву теки прибрати?
Бо в самих хедерах програми там усі include без назви теки, звісно ж.
Тому частина функціоналу лишається невидимою для компілятора.

Подякували: leofun011

11

Re: Проблеми при додаванні хедерів бібліотеки Freetype

Нарешті повністю розібрався.
В CMake треба було додати:

find_package(Freetype REQUIRED)
target_link_libraries(${PROJECT_NAME} ${FREETYPE_LIBRARY})
target_include_directories(${PROJECT_NAME} PRIVATE ${FREETYPE_INCLUDE_DIRS})

А щоб запрацювало автодоповнення в clangd і діагностика не видавала помилок,
треба було до файлу .clangd, що знаходиться в теці з програмою,
додати шлях до відповідної бібліотеки в CompileFlags.
Ось так він зараз виглядає:

Hover:
  ShowAKA: Yes
Diagnostics:
  UnusedIncludes: Strict
CompileFlags:
  Add: [-std=c++20, -Wpedantic, -I/usr/include/freetype2]
Подякували: leofun011