【问题标题】:Linking freetype with cmake将 freetype 与 cmake 链接
【发布时间】:2014-05-27 11:30:34
【问题描述】:

在使用extern C 库构建C++11 项目时,我无法在Linux 下使用cmake 链接freetype 2

使用 cmake 和 freetype 2 我基本上有 2 个选项:

  • 使用实用程序freetype-config 就像freetype-config --libs
  • 使用FindFreetype cmake module

现在我正在尝试实现第二个选项,但我对cmake 不是很熟练,也不了解它的逻辑。

我的问题是链接阶段,我不知道如何正确地做到这一点,而且这个模块并不像 freetype-config --libs 的结果那样完整,它确实包括我需要的所有库和标志,而不仅仅是路径一个文件;所以我假设我必须为zliblibpng 做同样的事情。

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(只是一些随机代码,所以我有一些东西可以提供给编译器)

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";
  }
}

【问题讨论】:

    标签: c++ cmake dynamic-linking freetype


    【解决方案1】:

    要加载像FindFreetype.cmake 这样的模块,您需要在cmake 中使用find_package-命令来使用它。第一个参数是包名。其对应文件名的“查找”由cmake自动添加。

    虽然include 可能与find_package 一起使用,但您可以添加一些标志。比如下图REQUIRED,在找不到freetype的时候让cmake失败。

    另外与 cmake 的链接应使用命令target_link_libraries 完成。

    这就是我给你写 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 独立于平台,而CMAKE_EXE_LINKER_FLAGS 中的'-lfreetype 则不是。

    CMakeLists.txt 将适用于其他提供 freetype 的平台。

    (2019 年编辑:使用 target_include_directories() 而不是 include_directories()

    【讨论】:

    • 我需要一个完整的例子,因为这是我第一次使用这个。
    • 所以使用include(FindFreetype) 是错误的吗?我还发现target_link_libraries(demo freetype) 也可以,有什么不同吗?
    • 所以区别在于如果include 失败将不会有消息或中断,而include 是一个非常通用的命令。 find_package 是一个更具体的宏,具有更多的控制和选项。但是这两种情况的结果都是包含我想要的包?我的意思是,如果你把“控件”和业务逻辑搁置一分钟,效果是一样的?
    • target_include_directories 与现代 CMake (3.0+) 一起使用,以避免使用全局标志污染其他项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2017-11-27
    • 2021-08-21
    相关资源
    最近更新 更多