Linking freetype with cmake

user2485710 picture user2485710 · May 27, 2014 · Viewed 14k times · Source

I'm having troubles with linking freetype 2 under linux using cmake when building a C++11 project with an extern C library.

With cmake and freetype 2 I basically have 2 options :

  • use the utility freetype-config like freetype-config --libs
  • use the FindFreetype cmake module

Now I'm trying to implement the second option and I'm not very skilled with cmake nor I understand the logic of it.

My problem is the linking phase, I have no idea how to do that properly plus this module is not as complete as the result of freetype-config --libs which really includes all the libraries and flags that I need, and not just the path of a file; so I'm assuming that I have to do the same for zlib and libpng.

CMakeLists.txt

cmake_minimum_required (VERSION 2.6)
project (FreetypeTutorials1)

include(FindFreetype)
include_directories(${FREETYPE_INCLUDE_DIRS})

SET(CMAKE_CXX_FLAGS "-O2 -std=c++11")

SET(CMAKE_EXE_LINKER_FLAGS "-v -lfreetype")

add_executable( demo "${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp")

./src/main.cpp ( just some random code so I have something to feed to the compiler )

extern "C" {
#include <ft2build.h>
#include FT_FREETYPE_H
}
#include <iostream>
int main()
{
  FT_Library library;
  auto error = FT_Init_FreeType(&library);
  if (error)
  {
    std::cout << "An error !\n";
  }
}

Answer

Patrick B. picture Patrick B. · May 27, 2014

To load a module like FindFreetype.cmake you need to use it in cmake with the find_package-command. The first argument is the package name. The "Find" of its corresponding filename is added automatically by cmake.

While include might work with find_package you can add some flags. For example, as shown below, REQUIRED, to make cmake fail when freetype wasn't found.

Additionally linking with cmake should be done with the command target_link_libraries.

This is how I would write you CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (FreetypeTutorials1)

find_package(Freetype REQUIRED)

SET(CMAKE_CXX_FLAGS "-O2 -std=c++11")

SET(CMAKE_EXE_LINKER_FLAGS "-v")

add_executable( demo src/main.cpp) # CMAKE_CURRENT_SOURCE_DIR is implicit here
target_link_libraries(demo ${FREETYPE_LIBRARIES})
target_include_directories(demo PRIVATE ${FREETYPE_INCLUDE_DIRS})

target_link_libraries is platform independent whereas '-lfreetype in CMAKE_EXE_LINKER_FLAGS is not.

The CMakeLists.txt will work on other platforms where freetype is available.

(Edit 2019: use target_include_directories() instead of include_directories()